看懂Shell脚本速成—变量

1 变量

1.1脚本参数

     

示例:

  脚本:

  

#!bin/bash

#参数示例
echo "************************************************************"
echo "This is $# ,value $# (参数个数)"
echo "This is $* ,value $* (所有传参)"
echo "This is $1 ,value $1 (传参1)"
echo "This is $2 ,value $2 (传参2)"
echo "This is $$ ,value $$ (脚本运行的当前进程ID)"
echo "This is $! ,value $! (后台最后一个进程ID号)"
echo "This is $@ ,value $@ (与$*相同,使用需要加引号)"
echo "This is $? ,value $? (显示最后命令执行状态,0为没有错误"
echo "************************************************************"

  结果 

       

Tips: 脚本中如何获取绝对路径?

答:

#!bin/bash

#获取当前脚本绝对路径
BASE_PATH=$(cd `dirname $0`; pwd);
echo "$(cd \`dirname $0\`; pwd)" $BASE_PATH
 #dirname $0,取得当前执行的脚本文件的父目录
 #cd `dirname $0`,进入这个目录(切换当前工作目录)
 #pwd,显示当前工作目录(cd执行后的)

1.2 shell中命令替换、变量子串、数学加减符号使用

1.2.1 命令替换  ` ` 和 $( )

  说明: ` ` (反引号)和 $( )来作命令替换。先完成符号内的命令行,再将其结果替换出来。

  区别:` `更通用,$()部分系统不支持

  示例:

#!bin/bash
echo $(pwd)
echo `ls -l`

  执行结果

 1.2.2 变量子串 ${}

  变量截取

 # 是左边开始

   % 是去掉右边

       单一符号(#或%)是最小匹配;两个符号是最大匹配(##或%%)

   *是用来匹配不要的字符,也就是想要去掉的那部分

   还有指定字符分隔号,与*配合决定取哪部分

   示例:

#!bin/bash

echo "***********去掉从左边数第一个.左边的**************"
values=left.right.last
echo "原始值 $values ,${values#*.} 修改后" ${values#*.}
echo "*************************************************"

echo "***********去掉从右边数第一个.右边的**************"
echo "原始值 $values ,${values%.*} 修改后" ${values%.*}
echo "*************************************************"

value2=one.two.last
echo "***********去掉从左边数最后一个.左边的***********"
echo "原始值 $value2 ,${value2##*.} 修改后" ${value2##*.}
echo "*************************************************"

echo "***********去掉从右边数最后一个.右边的************"
echo "原始值 $value2 ,${value2%%.*} 修改后" ${value2%%.*}
echo "*************************************************"

运行结果

   

 取子串及替换

 ${value:start:len} 取value从start开始长为len的值

 ${value/val1/val2} 将第一个val1换为val2

 ${value//val1/val2} 将所有val1换为val2

 ${#value} 获取变量长度

 示例:

#!bin/bash
values=left.right.last
echo "******************截取开头4位********************"
echo "原始值 $values ,${values:0:4} 修改后" ${values:0:4}
echo "*************************************************"

echo "******************替换第一个.为|**************"
echo "原始值 $values ,${values/./|} 修改后" ${values/./|}
echo "*************************************************"

e*-
cho
"******************替换所有.为|**************" echo "原始值 $values ,${values//./|} 修改后" ${values//./|} echo "*************************************************"

结果:

 根据状态为变量赋值

命令解释备注
${file-my.file.txt} 若 $file 没设定,则使用 my.file.txt 作传回值 空值及非空值不作处理
${file:-my.file.txt} 若 $file 没有设定或为空值,则使用 my.file.txt 作传回值 非空值时不作处理
${file+my.file.txt} 若$file 设为空值或非空值,均使用my.file.txt作传回值 没设定时不作处理
${file:+my.file.txt} 若 $file 为非空值,则使用 my.file.txt 作传回值 没设定及空值不作处理
${file=txt} 若 $file 没设定,则回传 txt ,并将 $file 赋值为 txt 空值及非空值不作处理
${file:=txt} 若 $file 没设定或空值,则回传 txt ,将 $file 赋值为txt 非空值时不作处理
${file?my.file.txt} 若 $file 没设定,则将 my.file.txt 输出至 STDERR 空值及非空值不作处理
${file:?my.file.txt} 若 $file没设定或空值,则将my.file.txt输出至STDERR 非空值时不作处理

1.2.3 $(( ))与整数运算

1)在(())中可使用数学+-*/符号

2)$(( ))可以将其他进制转成十进制数显示出来。 

      示例:

[root@localhost ~]# echo $((2#110))
6
[root@localhost ~]# echo $((16#2a))
42
[root@localhost ~]# echo $((8#11))
9
原文地址:https://www.cnblogs.com/zzzmublog/p/12081270.html