Haste makes waste

linux-08-shell与shell script

Posted on By lijun

1. shell与shell script

操作Kernel提供的功能时,需要与OS产生交互式的操作。shell正是担任这这种角色,接收用户的command输入,执行command后,将结果返回。

比如最常见的ls

$ ls ↵ 
file_a file_b .... 

按照一定条件将上面的command组合起来,就是shell script。

2. shell script

2.1 创建shell scirpt

  • 执行shell script
$ vi lsdate.sh ↵	(lsdate.shというファイルを作ります) 
  • 编写 lsdate.sh
1 #!/bin/bash	(利用するシェルを指定) 
2	(2行目は空行) 
3 ls 
4 date 
(左端は行番号です。) 
  • 修改权限 为了使lsdate.sh能执行,需要给它赋予执行权限x。
$ ls -l lsdate.sh 
-rwxrwxr-x 1 okada okada      21 Jun 6  09:51  lsdate.sh 

如果没有权限的话,用下面的命令添加权限:

$ chmod u+x lsdate.sh ↵ 

执行后结果如下:

$ ./lsdate.sh ↵ 
Desktop 	diff2ls-l-outputls-usr-bin 	touched-file (lsの実行結果) 

Fri  Jun  6  09:55:05 JST 2008(dateの実行結果) 

2.2 变量(shell变量和环境变量export)

$ abc=123 ↵ 
$ echo $abc ↵(abcの内容を表示する) 
123 

$ abc[0]=123 ↵ 
$ abc[1]=456 ↵ 
$ echo ${abc[0]} ↵(abc[0]の内容を表示する) 
123 

$ index=1 ↵ 
$ echo 
${abc[$index]} ↵ (abc[1]の内容を変数を使って表示する) 
456 

  • shell变量和环境变量

shell script中有两类变量,shell变量和环境变量, shell变量只在正在执行的script中有效,环境变量全局有效,环境变量可以通过shell变量生成。

$ export abc ↵ (シェル変数abcを環境変数abcにする) 
$ export xyz=234 ↵(環境変数xyzを作成し234を代入する) 
  • BBB.shの中でCCC.shを動作させると、abcは引き継がれないが、xyzは引き継 がれる
#!/bin/bash 
abc=123 
export xyz=234 
./CCC.sh

2.3 echo command

通过echo可以输出变量($abc)内容。

echo [オプション] 文字列 

1. -n 不换行

$ abc=123 ↵ 

$ echo abc ↵ 
abc 

$ echo $abc ↵
123

2.4 read command

读入标准输入

$ echo $abc ↵ 
123 シェル変数abcの中身が表示されます。 

$ read abc ↵ 
aaabbbccc	何か入力します。 
$ echo $abc ↵ 
aaabbbccc

シェル変数abcの中身が入れ替わっています。 

2.5 变量一览与删除(set / unset)

  1. 通过 set列举出所有变量(含环境变量),通过unset abc

  2. 通过env列举所有环境变量,export abc= 清除环境变量abc

$ env ↵ 
... 
...
環境変数一覧。 

$ export abc=

環境変数abcの内容を削除する。 

2.6 shell script的option

2.6.1 特殊符号

  • #注释

  • 引用符 单引号 ' ,双引号 ",回引号 ```

  1. 单引号' : 不展开变量
  2. 双引号" : 展开变量
  3. 回引号``` : 引入命令
$ abc=xyz 

$ echo 'value abc is $abc' 
value abc is $abc		$abcが文字として認識され展開された。 

$ echo "value abc is $abc" 
value abc is xyz		$abcが変数として認識され、内容であるxyzが展開

$ abc=`date`; 
$ echo $abc 
Thu Mar 20 06:08:14 JST 2008	$abcにdateコマンドの実行結果が入っている。

2.6.2 参数($1,$2…)

shell script中,可以传入执行时所需要的参数,使用$数字的方式。

$ cat args.sh ↵ 

#!/bin/bash 
echo '$1:' $1; 
echo '$2:' $2; 
echo '$3:' $3; 
echo '$0:' $0; 
echo '$#:' $#; 

$ ./args.sh aaa bbb ccc ↵ 

$1: aaa		一つ目の引数は$1 
$2: bbb		二つ目の引数は$2 
$3: ccc		三つ目の引数は$3 
$0: ./args.sh 	$0は実行コマンド名 
$#: 3		$#は、引数の数を示す。 

2.6.3 shift命令

挪动参数的位置,shiftを実行すると、$2が$1に、$3が$2に・・・になります。

  • 实例:
$ cat argsshift.sh  ↵ 
#!/bin/bash 
echo '$1:' $1; 
echo '$2:' $2; 
echo '$3:' $3; 
shift 
echo '$1:' $1; 
echo '$2:' $2; 

$ ./argsshift.sh aaa bbb ccc ↵ 
$1: aaa 
$2: bbb 
$3: ccc 
$1: bbb			$1がbbbに変わった 
$2: ccc			$2がcccに変わった 

2.6.4 控制符

与其他语言一样,shell中也有控制符,如果要输出控制符,需要处理:

$echo "\"" ↵ 
"		ダブルクオートが出力される。 

2.6.5 source command

在shell script,如果需要引用其他script,可以使用 source 或是 .

source /etc/init.d/functions 
. /etc/init.d/functions 

2.6.6 バックスラッシュ\

$ echo "abcedfghijklmn\ ↵ 
> pqrstuvwxyz" ↵

abcedfghijklmnopqrstuvwxyz 	途中でバックスラッシュを入れても同じ結果となる。 

3. 条件判断

3.1 if文

if 条件式 1 then ... elif 条件式 2 ... else ... fi 

3.2 条件式

  • a = b
  • a != b
  • a -eq b:等于
  • a -ne b:不等于
  • a -ge b:greater equal 大于等于
  • a -le b:less equal 小于等于
  • a -gt b:greater than 大于
  • a -lt b:less than 小于

3.3 文件属性比较

if [ -d パス ]; then.....
  • -f:文件存在,且为一般的文件
  • -d:文件存在,且为目录
  • -e:文件存在
  • -x:文件存在,而且有执行权限
  • -L:文件存在,而且有symbolic link

3.4 多个条件判断

  • AND条件 ,下面两种写法
[条件A -a 条件B -a 条件C ] .... 
[条件A] && [条件B] && [条件C] ... 
  • OR条件
[条件A -o 条件B -o 条件C ] ....
[条件A] || [条件B] || [条件C] ... 

3.5 一对多的条件判断

if 条件式 then
 : 
elif 条件式 then
 : 
elif 条件式 then
 : : 

fi 

或是用case的语法

case 変数 in 

	値A) 
		処理1;; 
	値B) 
		処理2;; 
esac 
  • 实例1

case $1 in
		a|A)
			echo "引数にaまたはAが入力されました";;
		b|B)
			echo "引数にbまたはBが入力されました";; 
esac

4. 循环

  • for 循环
for 変数 in 値のリスト 
do 
	処理 
done 
$ for i in a b c d 
> do
> 	echo $i 
> done 
a
b
c
d

  • while / until 循环
while 条件式 
do 
	処理 
done 
until 条件式 

do 
	処理 
done 

  • break与continue控制循环,与其他语言语法一致

5. 函数

与其他语言一致

function 関数名 
{ 
	処理
	return 变量名
 }