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)
-
通过
set
列举出所有变量(含环境变量),通过unset abc
-
通过
env
列举所有环境变量,export abc=
清除环境变量abc
$ env ↵
...
...
環境変数一覧。
$ export abc=
環境変数abcの内容を削除する。
2.6 shell script的option
2.6.1 特殊符号
-
#
注释 -
引用符 单引号
'
,双引号"
,回引号 ```
- 单引号
'
: 不展开变量 - 双引号
"
: 展开变量 - 回引号``` : 引入命令
$ 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 变量名
}