shell指令
一、条件判定
1. 基础格式
if condition
then
statement1
else
statement2
fi
2.常用的条件判断
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d DIR ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -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 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -z STRING ] 如果STRING的长度为零则为真 ,即判断是否为空,空即是真;
[ -n STRING ] 如果STRING的长度非零则为真 ,即判断是否为非空,非空即是真;
[ STRING1 = STRING2 ] 如果两个字符串相同则为真 ;
[ STRING1 != STRING2 ] 如果字符串不相同则为真 ;
[ STRING1 ] 如果字符串不为空则为真,与-n类似
INT1 -eq INT2 INT1和INT2两数相等为真 ,=
INT1 -ne INT2 INT1和INT2两数不等为真 ,<>
INT1 -gt INT2 INT1大于INT1为真 ,>
INT1 -ge INT2 INT1大于等于INT2为真,>=
INT1 -lt INT2 INT1小于INT2为真 ,<</div>
INT1 -le INT2 INT1小于等于INT2为真,<=
3. 示例
判断目录是否存在
if [[ -d "$python_package" ]]; then
echo '已解压'
else
tar zxvf Python-3.6.15.tgz
cd Python-3.6.15
./configure --prefix=/usr/local/python36
make && make install
fi
判断文件是否存在
if [[ ! -f "/usr/bin/python3" ]]; then
ln -s /usr/local/python36/bin/python3 /usr/bin/python3
fi
判断进程是否启动
nginx_str=`ps aux | grep 'nginx' | wc -l`
nginx_count=${#nginx_str}
if (($nginx_count!=0)); then
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
fi
二、 字符串处理
1. 截取字符串
如果想从字符串的左边开始计数,那么截取字符串的具体格式如下:
# 其中,string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。
${string: start :length}
url="c.biancheng.net"
echo ${url: 2} #省略 length,截取到字符串末尾
如果想从字符串的右边开始计数,那么截取字符串的具体格式如下:
${string: 0-start :length}
url="c.biancheng.net"
echo ${url: 0-13: 9}
这里需要强调两点:
从左边开始计数时,起始数字是 0(这符合程序员思维);从右边开始计数时,起始数字是 1(这符合常人思维)。计数方向不同,起始数字也不同。
不管从哪边开始计数,截取方向都是从左到右。
2. 从指定字符(子字符串)开始截取
这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。
# 使用#号可以截取指定字符(或者子字符串)右边的所有字符,具体格式如下:
${string#*chars}
url="http://c.biancheng.net/index.html"
echo ${url#*:}
3. 字符串拼接
在 Shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接,非常简单粗暴
name="Shell"
url="http://c.biancheng.net/shell/"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
4. 字符串长度
在 Shell 中获取字符串长度很简单,具体方法如下
${#string_name}
str="http://c.biancheng.net/shell/"
echo ${#str}
5. 字符串引号说明
字符串可以由单引号’ '包围,也可以由双引号" "包围,也可以不用引号
-
由单引号’ '包围的字符串:
任何字符都会原样输出,在其中使用变量是无效的。
字符串中不能出现单引号,即使对单引号进行转义也不行。 -
由双引号" "包围的字符串:
如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
字符串中可以出现双引号,只要它被转义了就行。 -
不被引号包围的字符串
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
n=74
str1=xxx.xxx.xxx$n str2="shell \"script\" $n"
str3='haha $n'
echo $str1
echo $str2
echo $str3
xxx.xxx.xxx74
shell "script" 74
haha $n
str1 中包含了 n , 它 被 解 析 为 变 量 n 的 引 用 。 n,它被解析为变量 n 的引用。 n,它被解析为变量n的引用。n后边有空格,紧随空格的是 str2;Shell 将 str2 解释为一个新的变量名,而不是作为字符串 str1 的一部分。
str2 中包含了引号,但是被转义了(由反斜杠\开头的表示转义字符)。str2 中也包含了$n,它也被解析为变量 n 的引用。
str3 中也包含了$n,但是仅仅是作为普通字符,并没有解析为变量 n 的引用。
6. 换行输出
默认情况下,echo关闭了对转义字符的解释,添加 -e 参数可打开echo对转义字符的解释功能。-E关闭转义字符,是默认值。
echo -e "hello\n wrold" #换行输出 hello world
echo -E "hello\n wrold" #输出 hello\n world, 默认情况
说明: 当前终端使用一次 echo -e后,echo对转义字符的解释功能打开,后续都转义字符都有效。更推荐使用printf 命令进行输出,printf还支持格式化输出,和C语言中printf功能类似,示例代码如下
a=1231
printf "%d - %d = $a\n" 12 123 #输出12 - 123 = 1231
printf "%d - %d = $a\n\n" 12 123 #输出 12 - 123 = 1231 空白行
printf不会像echo那样在一行结束自动添加换行符,连续多行使用printf时需要注意下。
printf命令语法printf format-string [arguments…], 参数之间用空格隔开,不能是逗号
三、时间处理
1. 获取系统当前日期
cur_date="`date +%Y-%m-%d`"
2. 获取系统当前时间
cur_date_time="`date +%Y-%m-%d,%H:%m:%s`"