目前用到shell的情况比较简单,暂时总结一部分,日后用到时回顾补充
1. linux的默认shell是bash,shell脚本开头需要定义用哪种解释器
例:#!/bin/bash
2. 运行方法
chmod +x test.sh
./test.sh
或
/bin/sh test.sh
3. 变量
所有变量默认为字符串,无论有没有引号。
声明:变量名不加$,变量名和等号之间不能有空格
使用:在变量名前加$,可用{}界定边界 echo “I am good at ${skill}Script”
赋值:等于号,但涉及计算的需要用命令:
(()):双小括号,整数运算符
echo $(($a+2))
echo ((2>1)) 输出1(真1假0)
((a=$b+1+2))
let:let val=$val+1
expr:
只读变量:readonly命令
myUrl="http://www.google.com"
readonly myUrl
删除变量:unset variable_name
读取文件:
cat test.txt | while read line
do
echo $line
done
while read line
do
echo $line
done < test.txt
4. 字符串
建议使用双引号,里面可以出现变量和转义字符
下列输出相同:
greeting=“hello, “$your_name” !”
greeting_1=“hello, ${your_name} !”
长度:${#str}
截取:${str:1:4}
查找:grep(返回查找到的字符串)、=~(判断是否包含)
5. 数组
只有一维数组,定义:name=(val1 val2 val3 …)
长度:${array[*]}
6. 运算符
7. 注释
单行#,多行使用
:<<!
...
...
!
8. 参数
调用时可以加上参数,按顺序默认命名为$1,$2,…
$0是文件名
$#是参数个数
$$是脚本运行的当前进程ID号
$?是显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
9. 输出
echo或printf(printf同c,不加括号)
10. if test命令
if test ...
then
...
elif ...
then
...
else
...
fi
数值比较:
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
字符串:
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z | 字符串 字符串的长度为零则为真 |
-n | 字符串 字符串的长度不为零则为真 |
文件测试
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
11. 循环
有for while until case break continue
for var in item1 item2 ... itemN
do
...
done
while [[ condition ]]
do
...
done
until [[ condition ]]
do
...
done
case val in
val1)
...
;;
val2)
...
;;
esac
12. 输入输出重定向
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file |
command < file | 将输入重定向到 file |
command >> file | 将输出以追加的方式重定向到 file |
n > file | 将文件描述符为 n 的文件重定向到 file |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file |
n >& m | 将输出文件 m 和 n 合并 |
n <& m | 将输入文件 m 和 n 合并 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入 |