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. 字符串引号说明

字符串可以由单引号’ '包围,也可以由双引号" "包围,也可以不用引号

  1. 由单引号’ '包围的字符串:
    任何字符都会原样输出,在其中使用变量是无效的。
    字符串中不能出现单引号,即使对单引号进行转义也不行。

  2. 由双引号" "包围的字符串:
    如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
    字符串中可以出现双引号,只要它被转义了就行。

  3. 不被引号包围的字符串
    不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
    字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

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 的引用。 nnn后边有空格,紧随空格的是 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`"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值