Shell 常用

126 阅读2分钟

变量

  • 定义变量的时候,变量名无需添加$; 使用变量的时候才加$
  • 变量名和等号之间不能有空格;
  • 命名只能英文字母、数字、下划线组合。不能数字开头;
  • 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
your_name='test' #定义
echo $your_name 
echo ${your_name} 
  • 只读变量: 使用readonly
myUrl='www.juejin.cn'
readony myUrl 
  • 删除变量: unset, 变量被删除后不能被再次使用,unset命名不能删除只读变量。
    unset your_name

字符串

  • 单引号: 原样输出,变量无效;
  • 双引号: 可引用变量,可以出现转义字符;
  • 字符串拼接:
name='juejin'
message='hello,'$name' !' #单引号拼接
message="hello,"$name" !" #双引号拼接
message="hello, ${name} !"
  • 获取字符串长度: ${#name}
  • 提取子字符串
str='https://juejin.cn/editor/drafts'
#  从左边第几个字符开始,及字符的个数(从下标为8开始的字符截取6个字符串)
echo ${str:8:6} 
#  从左边第几个字符开始,一直到结束。
echo ${str:8}
#  从右边第几个字符开始,及字符的个数
echo ${str:0-13:6} 
#  从右边第几个字符开始,一直到结束。
echo ${str:0-13}
# 删除左边的,保留右边的 # 左边第一个/
echo '删除左边' ${str#*/}
echo '删除左边' ${str#*/editor}
# 删除左边,保留右边    ##  右边第一个/
echo '删除左边'  ${str##*/}

# 删除右边,保留左边  %  第一个
echo '删除右边' ${str%/*}
echo '删除右边' ${str%/drafts}
# 删除右边字符,保留左边字符 %% 最后一个 
echo '删除右边' ${str%%/*}

数组

  • 支持一维数组(不支持多维数组),并且没有限定数组的大小。
    数字名=(值1 值2);
    arr=(1 2 3);
  • 可以不使用连续的下标,而且下标的范围没有限制。 arr[10]=10
  • 数组元素读取: ${数组名[下标]}
    ${arr[0]}
  • 获取全部元素:@ * echo ${arr[@]}
    echo ${arr[*]}
  • 获取数组长度:和获取字符串长度方法相同
arr=(1 2 3)
echo ${#arr[@]}
echo ${#arr[*]}

注释

  • 单行注释: #
  • 多行注释:
:<<EOF
注释
注释
EOF

:<<'
注释1
注释1
'

:<<!
注释2
注释2
!

参数传递

  • $n:脚本内获取参数。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数;
  • $0:为执行的文件名(包含文件路径);
  • $?:显示最后命令的退出状态。0:没有错误。
  • $#:参数的个数
echo '第一个参数:' $0 
echo '参数的个数' $#
echo '最后命名的退出状态:' $?
if [ $? ];then echo '成功' ; else echo '失败'; fi ;
echo '脚本运行的当前进程ID号' $$	
echo '后台运行的最后一个进程的ID号' $!
  • $:以一个单字符串显示所有向脚本传递的参数。
  • **@:@**:与*相同,但是使用时加引号,并在引号中返回每个参数。
function a(){
    echo "-- \$* 演示 ---"
    for i in "$*"; do
        echo $i
    done
}

function b(){
    echo "-- \$@ 演示 ---"
    for i in "$@"; do
        echo $i
    done
}
a 1 2 3
b 2 4 6
  • 判断参数
echo '第一个参数:' $1
if [ -n "$1" ]; then
    echo "包含第一个参数";
else
    echo "没有包含第一参数";
fi;

echo '第一个参数:' $1
if [ "$1" ]; then
    echo "包含第一个参数";
else
    echo "没有包含第一参数";
fi;

运算符

算数运算符

  • 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awkexpr,expr 最常用。
  • 乘号*前边必须加反斜杠\才能实现乘法运算;
a=11
b=5
echo '和' `expr $a + $b`
echo '差' `expr $a - $b`
echo '积' `expr $a \* $b` # *需要进行转义
echo '商' `expr $a / $b`
echo '余' `expr $a % $b`

关系运算符

-eq -ne -gt -ge -lt -le

布尔运算符

  • ! 非
  • -o : 或or
  • -a : 与and

逻辑运算符

  • &&:逻辑and
  • ||: 逻辑OR

字符串运算符

  • = 检测两个字符串是否相等,相等返回true。
  • != 检测两个字符串是否不相等,不相等返回true。
  • -z 检测字符串长度是否为0,为0返回true。
  • -n 检测字符串长度是否不为0,不为0返回true。
  • $ 检测字符串是否为空,不为空返回true。
str1="123456"
str2="efg"

if [ $str1 = $str2 ]
then
   echo "$str1 = $str2 : str1 等于 str2"
else
   echo "$str1 = $str2: str1 不等于 str2"
fi
if [ $str1 != $str2 ]
then
   echo "$str1 != $str2 : str1 不等于 str2"
else
   echo "$str1 != $str2: str1 等于 str2"
fi
if [ -z $str1 ]
then
   echo "-z $str1 : 字符串长度为 0"
else
   echo "-z $str1 : 字符串长度不为 0"
fi
if [ -n "$str1" ]
then
   echo "-n $str1 : 字符串长度不为 0"
else
   echo "-n $str1 : 字符串长度为 0"
fi
if [ $str1 ]
then
   echo "$str1 : 字符串不为空"
else
   echo "$str1 : 字符串为空"
fi

if 判断

if的基本语法:

if [ command ];then
   符合该条件执行的语句
elif [ command ];then
   符合该条件执行的语句
else
   符合该条件执行的语句
fi

文件/文件夹(目录)判断

  • [ -d DIR ] 如果 FILE 存在且是一个目录则为真。
  • [ -e FILE ] 如果 FILE 存在则为真。

字符串判断

  • [ -z STRING ] 如果长度为零则为真 ,即判断是否为空,空即是真。
  • [ -n STRING ] 如果长度非零则为真 ,即判断是否为非空,非空即是真。
  • [ STRING1 = STRING2 ] 如果两个字符串相同则为真。
  • [ STRING1 != STRING2 ] 如果字符串不相同则为真。
  • [ STRING1 ]  如果字符串不为空则为真,与-n类似。
str1='123'
str2='123'
str3='1234'
if [ $str1 = $str2 ]
then
    echo '相等';
else
    echo '不相等';
fi
if [ $str1 != $str3 ]
then
    echo '不相等';
else
    echo '相等';
fi

数值判断

  • -eq: = equal to 等于
  • -ne: != not equal to 不等于
  • -ge: >= greater than or equal to 大于等于
  • -gt: > greater than 大于
  • -le: <= less than or equal to 小于等于
  • -lt: = less than 小于

for循环

for的基本语法:

for 循环变量
do
   循环语句
done

数字型

# for ((i=1;i<10;i++)) #方式一
# for i in $(seq 2 8)  #seq 开始 结束
for i in {2..9}  #{开始..结束}
do 
	echo $i
done

字符型

# for i in `ls` 
# for i in '1 23 45' #空格作为分隔
for i in 1 23 45 
do 
    echo $i
done

for in语句与` `和$( )合用,利用` `或$( )的将多行合为一行的缺陷,实际是合为一个字符串。