Yan.G WebServer Dev Engineer

linux shell

2019-04-17

date

bash shell 运行方式

注释事项

a=1     // 正常运行 
b = 2   // 错误
c= 3    // 错误
# 任何空格都将导致错误

字符串截取

d='hello'  
e="word"
echo $d$e 
## hello word
echo hello ${word}
## hello word

echo ${d#*l}
# lo

echo ${##*l}
# o

##  # 表示截取 从 文本开头截取到 通配搜索位
##  * 通配 
##  单 # 选取最短路径的匹配 
##  双 # 选取最长路径的匹配 
##  路径标识搜索范围
str="aabbccaaabbbcccaaaabbbbccccaabbccabc"

echo ${str#*a}
## abbccaaabbbcccaaaabbbbccccaabbccabc

echo ${str##*a}
## bc

echo ${str%bbcc*}
## aabbccaaabbbcccaaaabbbbccccaa

echo ${str%%bbcc*}
## aa

## % 表示截取 从 同配置搜索位 截取到 文本末尾
## 单双 % 和 单双 # 作用方式是一样的 (范围作用相反 % 从后向前  # 从前向后)

echo ${str:0:3}
## : 和其他语言一样 第一个参数从 0 开始结算 
## 第二个参数是截取的个数
## 第二个参数可以是负数 从 -1 开始 (标识截取最后一个字符)
echo ${str:0:-1} 
## aabbccaaabbbcccaaaabbbbccccaabbccab 

命令行自变量

# bash 可以通过命令行获取外部变量
# $1 表示第一个外部变量
# $2 表示第二个外部变量
# ... 依此类推

if 语句

if [ condition ]
then 
    action

elif [ condition2 ]
then 
    action2

elif [ condition3 ]
then
    action3 

else
    actionx
fi
  • if 判断 两个中括号中间一定有两个空格

if 文件运算符

| 运算符 | 描述 | 示例 | | ———— | ———— | ———— | |-e |filename |如果 filename存在,则为真 [ -e /var/log/syslog ]| |-d |filename |如果 filename为目录,则为真 [ -d /tmp/mydir ]| |-f |filename |如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]| |-L |filename |如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]| |-r |filename |如果 filename可读,则为真 [ -r /var/log/syslog ]| |-w |filename |如果 filename可写,则为真 [ -w /var/mytmp.txt ]| |-x |filename |如果 filename可执行,则为真 [ -L /usr/bin/grep ]| |filename1 -nt |filename2 |如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]| |filename1 -ot |filename2 |如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]|

if 比较运算符

| 运算符 | 描述 | 示例 | | ———— | ———— | ———— | |-z string |如果 string长度为零,则为真 |[ -z “$myvar” ] | |-n string |如果 string长度非零,则为真 |[ -n “$myvar” ] | |string1= string2 |如果 string1与 string2相同,则为真 |[ “$myvar” = “one two three” ] | |string1!= string2 |如果 string1与 string2不同,则为真 |[ “$myvar” != “one two three” ] |

if 算数运算符

| 运算符 | 描述 | 示例 | | ———— | ———— | ———— | |num1-eq | num2 | 等于 [ 3 -eq $mynum ] | |num1-ne | num2 | 不等于 [ 3 -ne $mynum ] | |num1-lt | num2 | 小于 [ 3 -lt $mynum ] | |num1-le | num2 | 小于或等于 [ 3 -le $mynum ] | |num1-gt | num2 | 大于 [ 3 -gt $mynum ] | |num1-ge | num2 | 大于或等于 [ 3 -ge $mynum ] |

字符串比较

if [ "$myvar" = "foo bar oni" ]
then 
     echo "yes"
fi
## 所有字符串自变量用双引号括起,避免bash发生意外的解析问题

for 循环体

for x in one two three four
do
    echo number $x
done

## number one
## number two
## number three
## number four

输出文件夹内所有文件

for file in /var/log/sys*
do
    if [ -f ${file} ]
    then
        echo ${file}
    fi
done

while 循环体

while [ condition ]
do
    statements
done

case 语句 (循环解压)

case "${x##*.}" in
     gz)
           gzunpack ${SROOT}/${x}
           ;;
     bz2)
           bz2unpack ${SROOT}/${x}
           ;;
     *)
           echo "Archive format not recognized."
           exit
           ;;
esac

算数运算

## 使用 $(())
echo $((100/2))
# 50

函数

tarview() {
     echo -n "Displaying contents of $1 "

     if [ ${1##*.} = tar ]
     then 
         echo "(uncompressed tar)"
         tar tvf $1
     elif [ ${1##*.} = gz ]
     then 
         echo "(gzip-compressed tar)"
         tar tzvf $1
     elif [ ${1##*.} = bz2 ]
     then 
         echo "(bzip2-compressed tar)"
         cat $1 | bzip2 -d | tar tvf -
     fi
}

上一篇 xargs 传参工具

下一篇 git 常用命令

Content