linux shell 编程
介绍
shell 是 linux 下的脚本,可以很方便的执行一些操作,而不用编写程序编译
解释器
注:可以省略
脚本不指定的话就会采用系统默认的解释器去执行,但可以在脚本中进行指定,格式
#!/bin/bash
其必须在基本文件的第一行,并且以#!
开头,后面接解释器路径,如果指定没有解释器,则会报错
都有哪些解释器
- sh:unix 默认,所有的 unix 系统都有
- bash:linux 默认,所哟 linux 发行版都有
其他的想到再加
文件包含
相当于#include
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
变量
定义变量
str="abc" # 定义字符串
num=123 # 定义数字
cmd=$(cat test.file) # 通过命令
等号两侧没有空格
使用变量
shell 使用变量直接用美元符号即可
ch="aaa"
echo $ch
echo ${ch} #两种方式是等效的
cb="bbb"
re="$ch$cb" # "aaabbb"
特殊变量
$n:脚本传参的第 n 个参数
$#:脚本的参数个数
$?:上一个命令的运行结果
$@:所有参数
$*:所有参数
$$:当前进程 id
$?:上一个进程/函数的返回值
注: $*
和 $@
在不加引号时候使用是一样的,当使用引号后 "$*"
会将所有参数合成一个参数作为一个字符串, "$@"
则还是多个参数
函数
定义
[function] funname [()] {
...body...
}
其中 "function"和"()" 至少有一个,可以都有
函数获取参数以及返回值和脚本一致,通过$n 获取第 n 个参数,并且可以通过 $? 获取函数返回参数
function test(){
echo $1 // aaa
exit 1
}
test aaa
echo $? // 1
条件流程
if
if [ command ];then
# 符合该条件执行的语句
elif [ command ];then
# 符合该条件执行的语句
elif [[ command ]] ;then
# 符合该条件执行的语句
else
# 符合该条件执行的语句
fi
case
case "$op" in
"upload")
echo $op
;;
*)
panic "operation $op not allowed"
help
;;
esac
循环流程
for
lines=$(cat test.file)
for li in lines;do
echo $li
done
# 以下都是可以的
for((i=1;i<=10;i++));
for i in $(seq 1 10);
for i in {1..10};
for i in f1 f2 f3 ;
for file in /Volumes/work/*;
while
while [ $i -le 100 ];do
i=$(( $i + 1))
done
一些判断条件
文件相关
常用的:
[ -a FILE ] 如果 FILE 存在则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。
不常用的:
[ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。
[ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。
[ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。
[ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。(该选项在一些老系统上无效)
[ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。
[ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。
[ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。
[ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组)
[ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。
字符串相关
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ] 如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。
数字
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=
逻辑
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件
括号
${}:直接取值
[]:用在 while,if 判断
[[]]:高级运算,可以替换[]
$():执行命令
$(()):执行算术运算
一些脚本
判断当前系统
#!/bin/sh
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ] ; then
echo "Linux"
elif
[ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif
[ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi