shell脚本使用

shell特殊变量,分别是:$#、$*、$@、$?、$$

$0:当前脚本的文件名。
$n(n≥1):传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
$#:传递给脚本或函数的参数个数。
$*:传递给脚本或函数的所有参数。
$@:传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,"$*"会将所有的参数从整体上看做一份数据;"$*"会将所有的参数从整体上看做一份数据。
$?:上个命令的退出状态,或函数的返回值。
$$:当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

shell脚本获取命令行参数:getopts方式

while getopts ":a:b:c:" opt
do
    case $opt in
        a)
        echo "参数a的值$OPTARG"
        ;;
        b)
        echo "参数b的值$OPTARG"
        ;;
        c)
        echo "参数c的值$OPTARG"
        ;;
        ?)
        echo "未知参数"
        exit 1;;
    esac
done

结果如下:

$ ./test.sh -a 1 -b 2 -c 3

#在shell中的输出
参数a的值1
参数b的值2
参数c的值3

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

1) 由单引号' '包围的字符串:

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

2) 由双引号" "包围的字符串:

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

3) 不被引号包围的字符串

  • 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
  • 字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
获取字符串长度
string_name=abcd
echo ${#string_name}
字符串截取
从指定位置开始截取
这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。
1) 从字符串左边开始计数
  ${string: start :length} #string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。
2) 从右边开始计数
  ${string: 0-start :length} #同第 1) 种格式相比,第 2) 种格式仅仅多了0-,这是固定的写法,专门用来表示从字符串右边开始计数。
从指定字符(子字符串)开始截取 这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。 1) 使用 # 号截取右边字符   ${string#*chars} #string 表示要截取的字符,chars 是指定的字符(或者子字符串),*是通配符的一种,表示任意长度的字符串。*chars连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。   ${string##*chars} #直到最后一个指定字符(子字符串)再匹配结束 2) 使用 % 截取左边字符   ${string%chars*} #使用%号可以截取指定字符(或者子字符串)左边的所有字符
字符串替换
string=abc12342341
echo ${string/23/bb}   #abc1bb42341  替换一次    
echo ${string//23/bb}  #abc1bb4bb41  双斜杠替换所有匹配    
echo ${string/#abc/bb} #bb12342341   #以什么开头来匹配,根php中的^有点像    
echo ${string/%41/bb}  #abc123423bb  %以什么结尾来匹配,根php中的$有点像 

数组

#数组定义
arr=(1 2 3)
arr2=() #空数组
#字符串转数组
str=1,2,3,4
arr3=(${str//,/ })
#获取数组长度
echo ${#arr[*]}  或 echo  ${#arr[@]}
#查看数组所有数据
echo ${arr[*]}  或 echo ${arr[@]}
#数组动态追加元素
arr[${#arr[*]}]=追加的元素
#数组拼接:先利用@*,将数组扩展成列表,然后再合并到一起。
array_new=(${array1[@]}  ${array2[@]})
#删除数组
unset array_name
#删除数组指定下标数据
unset array_name[index]

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

函数定义、调用和返回值

function sum(){
 val1=$1  #函数第一个参数
 val2=$2  #函数第二个参数
 val3=$(($1+$2))
 echo $val3
}
 
#Call function with 2 parameters and it return 1 parameter.
ret_val=$(sum 10 20)
echo $ret_val

查询数据库数据并处理结果集

HOSTNAME="172.16.xx.xx"    #数据库信息
PORT="3306"
USERNAME="root"
PASSWORD="root"

DBNAME="log"         #数据库名称
TABLENAME="student"


COMMAND1="mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD} ${DBNAME}
方法一:
while read -a row
do
    echo "..${row[0]}..${row[1]}.."
done< <(echo "select  id ,name  from  student;" | ${COMMAND1})

方法二:
while read a b
do
    echo "..${a}..${b}.."
done< <(echo "select  id ,name  from  student;" | ${COMMAND1})

 

注释:注意"done< <("的写法,第一个"<"要和"done"之间没空格,两个"<"之间有一个空格,"<""("之间没空格。

比较运算符

-eq           //等于
-ne           //不等于
-gt            //大于 (greater )
-lt            //小于  (less)
-ge            //大于等于
-le            //小于等于

for循环

for item in (1 2 3)
do 
  echo $item
done

if条件判断

test命令,对特定条件进行测试,并使用$?对返回值进行判断

test 条件表达式

&

[ 条件表达式 ] //更为常用

注意: 中括号“[”和“]”与条件表达式之间均需要使用空格隔开,否则会出现错误!!

原文地址:https://www.cnblogs.com/jvStarBlog/p/14786274.html