『鳥哥のLinux私房菜』学習ノート(8)——bashスクリプトプログラミングの変数

17783 ワード

一、変数の命名
1、アルファベット、数字、下線のみを含み、数字で始まることはできません.2、システムに既存の環境変数と名前を変更するべきではありません.3、名前に意味があります.
二、変数賦課
変数名=値var_name=value等号の両側にスペースは使用できません
[root@hao ~]# NAME=jerry

[root@hao ~]# echo $NAME

jerry

三、bash:変数タイプ
1、環境変数
スクリプトは、実行時にサブシェルプロセスを開始します.コマンドラインで起動したスクリプトは、現在のshell環境変数、すなわち環境変数の役割ドメインが現在のshellプロセスとそのサブshellプロセスを継承します.システムが自動的に実行するスクリプト(コマンドライン起動以外)は、各環境変数を自己定義する必要があります.環境変数はexportを使用して設定できます.
export VARNAME=VALUE    VARNAME=VALUE export VARNAME

 
[root@hao ~]# NAME=jerry

[root@hao ~]# export NAME

[root@hao ~]# echo $NAME

jerry

[root@hao ~]# bash

[root@hao ~]# echo $NAME

jerry

[root@hao ~]# bash                     

[root@hao ~]# echo $NAME

jerry
[root@hao ~]# pstree
init-+-NetworkManager-+-dhclient
    ...
     |-sshd---sshd---sshd---bash---su---bash---bash---bash---pstree
     |-udevd---2*[udevd]
     `-wpa_supplican

2、ローカル変数(ローカル変数)
変数はプロセスの変数に違いないため、1つのshellで宣言された変数は他のshellでは使用できず、サブshellでも入手できません.参照変数に${varname}を追加するか、{}を追加しないこともできます.
[root@hao ~]# NAME=jerry

[root@hao ~]# echo $NAME

jerry

[root@hao ~]# bash

[root@hao ~]# echo $NAME



[root@hao ~]# exit

exit

[root@hao ~]# echo $NAME

jerry

ローカル変数:VARNAME=VALUE、役割ドメイン:bashプロセス全体.
ローカル変数:local VARNAME=VALUE、役割ドメイン:現在のコードセグメント.
3、位置変数
  $n
例:スクリプトを書き、パラメータ(ファイルパス)を受け入れ、そのパラメータが存在するファイルであるか否かを判定し、もしそうであれば「ok」を表示する
[root@hao ~]# nano filetest.sh [root@hao ~]# cat filetest.sh 

#! /bin/bash

#

if [ -e $1 ];then

    echo "ok"

else

    echo "no such file"

fi [root@hao ~]# chmod +x filetest.sh [root@hao ~]# ./filetest.sh  /etc/fstab

ok

[root@hao ~]# ./filetest.sh  /etc/fstabs

no such file

shift、shiftのたびに1つのパラメータを除去shift nはn個を除去することを表す
[root@hao ~]# nano filetest1.sh [root@hao ~]# cat filetest1.sh

#!/bin/bash

echo $1

shift

echo $1

shift

echo $1 [root@hao ~]# chmod +x filetest1.sh [root@hao ~]# ./filetest1.sh 1 2 3

1

2

3  

4、特殊変数(システム変数)
特定のデータを保存するには、次の手順に従います.
  $?:前のコマンドの実行状態の戻り値を保存します(0-255).0は正しく、その他はエラーです.このうち1,2127システムは予約されており、その他はカスタマイズ可能である.
[root@hao ~]# ls /var

account  crash  db     games  lib    lock  mail  opt       run    tmp  yp

cache    cvs    empty  gdm    local  log   nis   preserve  spool  www

[root@hao ~]# echo $?

0 [root@hao ~]# ls /varr

ls: cannot access /varr: No such file or directory

[root@hao ~]# echo $?

2

出力結果を見ずに返された状態値のみを見たい場合は、出力をデータブラックホール/dev/nullにリダイレクトするだけです.
[root@hao ~]# ls /varr &> /dev/null [root@hao ~]# echo $?

2

$#:パラメータの数
$*:パラメータリスト
$@:パラメータリスト(上とは異なります)
例:スクリプトを書き、パラメータ(ファイルパス)を受け入れ、そのパラメータが存在するファイルであるか否かを判定し、もしそうであれば「ok」を表示する
[root@hao ~]# nano filetest.sh [root@hao ~]# cat filetest.sh 

#! /bin/bash

#

echo $#

echo $*

echo $@

if [ $# -lt 1 ];then

    echo "Usage:./filetest.sh ARG1 ARG2 ..."

    exit 7

fi

if [ -e $1 ];then

    echo "ok"

else

    echo "no such file"

fi [root@hao ~]# chmod +x filetest.sh [root@hao ~]# ./filetest.sh  

0





Usage:./filetest.sh ARG1 ARG2 ...
[root@hao ~]# ./filetest.sh  /etc/fstab /etc/fstabs
2
/etc/fstab /etc/fstabs
/etc/fstab /etc/fstabs
ok

四、変数の取り消し
[root@hao ~]# unset NAME

[root@hao ~]# echo $NAME


五、現在のshell変数を表示現在のshellのすべての変数を表示し、環境変数とローカル変数を含む
[root@hao ~]# set

BASH=/bin/bash

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath

BASH_ALIASES=()

...

現在のshell環境変数printenv envまたはexportの表示
[root@hao ~]# printenv

HOSTNAME=hao

SHELL=/bin/bash

TERM=xterm

...

六、shell変数の追加
[root@hao ~]# ANIMAL=pig

[root@hao ~]# ANIMAL=$ANIMAL:goat

[root@hao ~]# echo $ANIMAL

pig:goat

[root@hao ~]# echo $PATH

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@hao ~]# export PATH=$PATH:/usr/local/apache/bin

[root@hao ~]# echo $PATH

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin

[root@hao ~]# export PATH=/usr/local/mysql/bin:$PATH

[root@hao ~]# echo $PATH

/usr/local/mysql/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin

七、最初のスクリプトプログラム
まずスクリプトプログラムfirstを作成する.sh,スクリプトプログラムの最初の行はプログラムの魔数を指定しなければならない,#!解釈器の経路を加える.次に実行権限を付与し、その後実行し、実行時にパスを追加します.パスが与えられていない場合、デフォルトでpathにコマンドが存在するかどうかを探します.
[root@hao ~]# cat first.sh

#!/bin/bash

ls /var

cat /etc/inittab

[root@hao ~]# chmod +x first.sh [root@hao ~]# ./first.sh

account  crash    db     games  lib    lock  mail  opt       run      tmp  yp

cache     cvs    empty  gdm    local  log   nis     preserve  spool  www

# inittab is only used by upstart for the default runlevel.

#

# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# System initialization is started by /etc/init/rcS.conf

#

# Individual runlevels are started by /etc/init/rc.conf

#

# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf

#

# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

# with configuration in /etc/sysconfig/init.

#

# For information on how to write upstart event handlers, or how

# upstart works, see init(5), init(8), and initctl(8).

#

# Default runlevel. The runlevels used are:

#   0 - halt (Do NOT set initdefault to this)

#   1 - Single user mode

#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)

#   3 - Full multiuser mode

#   4 - unused

#   5 - X11

#   6 - reboot (Do NOT set initdefault to this)

# 

id:5:initdefault: