Shell 脚本基础语法整理


author : lrcoder
date : 2019/06/22


标示符
标示符 含义 助记
-d ××× 如果×××为目录,为真
-f ××× 如果×××为常规文件,为真
-r ××× 如果×××可读,为真 <u>r</u>ead
-w ××× 如果×××可写,为真 <u>w</u>rite
-x  ××× 如果×××可执行,为真
-s ××× 如果×××长度不为0,为真
-eq = <u>eq</u>ual
-ne != u<u>ne</u>qual
-gt > bi<u>g t</u>han
-ge >= bi<u>g e</u>qual
-lt < <u>l</u>ittle <u>t</u>han
-le <= <u>l</u>ittle <u>e</u>qual
-e ××× 如果×××存在,为真
××× -a ××× 且 && <u>a</u>nd
××× -o ××× 或 || <u>o</u>r
赋值
name=Pzh            等号前后不能有空格
name="PZH"      变量值中有空格要用双引号
echo ${name}            用${}更保险
只读变量

使用readonly命令

#!/bin/bash
myUrl="www.baidu.com"
readonly myUrl
myUrl="www.12345.com"

运行报错:

pzh@pzh:~/桌面$ ./readonly_test.sh
./readonly_test.sh: 行 4: myUrl: 只读变量
删除变量

使用unset命令可以删除变量,unset命令不能删除只读变量。

#!/bin/bash
name="Pzh"
echo ${name}
##########################
myUrl="www.baidu.com"
readonly myUrl
echo ${myUrl}
##########################
unset name
echo ${name}
##########################
unset myUrl
echo ${myUrl}

运行结果:

pzh@pzh:~/桌面$ ./delet_test.sh
Pzh
www.baidu.com

./delet_test.sh: 第 12 行: unset: myUrl: 无法取消设定: 只读 variable
www.baidu.com
注释
单行注释
# echo "ni" 
多行注释
:<<!
...
...
!

或者

:'
...
...
...
'

Shell 字符串 (尽量使用双引号字符串)

字符串的定义和输出:
str='this is a string'
str1="i will print \" $str \" !\n"
echo -e ${str1}

运行结果为:

i will print " this is a string " !
字符串的拼接:
str='this is a string'
# 双引号拼接
myStr="hello, "$str"!"
myStr1="hello, ${str}!"
echo -e ${myStr}
echo -e ${myStr1}
# echo -e ${myStr} '\n'${myStr1}

运行结果为:

hello, this is a string!
hello, this is a string!
获取字符串长度
str='this is a string'
echo ${#str} # 输出 16
提取子字符串

从第2个字符开始截取5个字符

str='this is a string'
echo ${str:1:5} # 输出 his i 
查找子字符串

查找i或a的位置(哪个先出现就计算哪个)

str='this is a string'
echo `expr index "$str" ia` # 输出 3 

Shell 数组

数组的定义
#!/bin/bash
array_name=(1 2 3 4 5)
array_name0=(
value0 
value1
value2
value3
)
array_name1[0]=val0
array_name1[1]=val1
array_name1[2]=val2
array_name1[n]=val3
echo -e ${array_name[@]} '\n'${array_name[n]} '\n'${array_name[0]}
echo "--------------------------------------------------------------"
echo -e ${array_name0[*]} '\n'${array_name1[@]}

运行结果:

1 2 3 4 5 
1  
1
--------------------------------------------------------------
value0 value1 value2 value3 
val3 val1 val2

获取数组长度
# 获取数组元素个数
length=${#array_name[*]}
# 或者
length0=${#array_name0[@]}
# 获取数组单个元素长度
length1=${#array_name1[n]}
echo -e ${length} '\n'${length0} '\n'${length1}
# 输出
# 5
# 4
# 4

Shell 传递参数

#!/bin/bash
echo "shell passing-context-demo!";
echo "show filename : $0";
echo "fir context : $1";
echo "sec context : $2";
echo "thi context : $3";
echo "传递参数的个数 : $#";
echo "将传递的所有参数整合为一个字符串显示: $*"; 

执行命令:

chmod +x shell_context.sh
./shell_context.sh 1 2 3

运行结果:

shell passing-context-demo!
show filename : ./shell_context.sh
fir context : 1
sec context : 2
thi context : 3
传递参数的个数 : 3
将传递的所有参数整合为一个字符串显示: 1 2 3

@ 和* 的区别:

$@ 等价与传递多个参数

$* 是将多个参数整合为一个字符串,传第一个字符串

Shell运算符

算数运算符
#!/bin/bash
a=10;
b=20;
add=`expr $a + $b`;
echo -e "a + b = ${add}";# 输出 a + b = 30
sub=`expr $a - $b`;
echo -e "a - b = ${sub}";# 输出 a - b = -10
mul=`expr $a \* $b`; 
echo -e "a * b = ${mul}";# 输出 a * b = 200
div=`expr $a / $b`;
echo -e "a / b = ${div}";# 输出 a / b = 0
rem=`expr $a % $b`;
echo -e "a % b = ${rem}";# 输出 a % b = 10
# ------------------------------------------------------------------------
if [ $a == $b ]
then 
    echo "a equal b"
fi
if [ $a != $b ]
then
    echo "a un equal b" 
fi
# 输出 a un equal b
关系运算符
#!/bin/bash

a=10;
b=20;
# --------------------------------------------
if [ $a -eq $b ]
then
    echo "$a -eq $b : a = b"
else
    echo "$a -eq $b : a != b"
fi
# ---------------------------------------------
if [ $a -ne $b ]
then
    echo "$a -ne $b : a != b"
else
    echo "$a -ne $b : a = b"
fi
# ---------------------------------------------
if [ $a -gt $b ]
then
    echo “$a -gt $b : a > b”
else
    echo "$a -gt $b : a < b"
fi
# ---------------------------------------------
if [ $a -ge $b ]
then 
    echo "$a -ge $b : a >= b"
else
    echo "$a -ga $b : a <= b"
fi
# ---------------------------------------------
if [ $a -lt $b ]
then
    echo "$a -lt $b : a < b"
else
    echo "$a -lt $b : a > b"
fi
# ---------------------------------------------
if [ $a -le $b ]
then
    echo "$a -le $b : a <= b"
else
    echo "$a -le $b : a >= b"
fi

运行结果:

10 -eq 20 : a != b
10 -ne 20 : a != b
10 -gt 20 : a < b
10 -ga 20 : a <= b
10 -lt 20 : a < b
10 -le 20 : a <= b
循环语句
for循环
#!/bin/bash

add=0;
for loop in 1 2 3 4 5 6
do
    add=`expr $loop + $add `
done
echo "the final add : $add"

运行结果:

the final add : 21
while循环
#!/bin/bash
int=1
power=0
while(($int <= 6))
do 
    power=`expr $int + $power`
    let "int++"
done
echo "the final power : $power"

运行结果:

the final power : 21
until循环
#!/bin/bash
a=0
add=0
until [ $a == 6 ]
do
    let "a++"
    add=`expr $add + $a`
done
echo "the final add : $add"

运行结果:

the final add : 21
case循环(综合demo)

demo功能:

用户给出三个操作数:

chooseNum --- 选择计算方式(加、减、乘、除、求余)

val1 ---- 参加运算的第一个数字

val2 ---- 参加运算的第二个数字

返回相应结果;

#!/bin/bash
function sum(){
    
    val1=$1;
    val2=$2;
    val=$(($1+$2));
    echo $val;
}

function sub(){

    val1=$1;
    val2=$2;
    val=$(($1-$2));
    echo $val;
}

function mul(){

    val1=$1;
    val2=$2;
    val=$(($1*$2));
    echo $val;
}

function div(){
    
    val1=$1;
    val2=$2;
    val=$(($1/$2));
    echo $val;
}

function rem(){

    val1=$1;
    val2=$2;
    val=$(($1%$2));
    echo $val;
}

# main code  
chooseNum=$1;
val1=$2;
val2=$3;
case $chooseNum in
    1) echo "you choose sum $val1 and $val2";
    val=$(sum $val1 $val2);
    echo "$val1 + $val2 = $val";
    ;;
    2) echo "you choose sub $val1 and $val2"
    val=$(sub $val1 $val2);
    echo "$val1 - $val2 = $val";
    ;;
    3) echo "you choose mul $val1 and $val2";
    val=$(mul $val1 $val2);
    echo "$val1 * $val2 = $val";
    ;;
    4) echo "you choose div $val1 and $val2";
    val=$(div $val1 $val2);
    echo "$val1 / $val2 = $val";
    ;;
    5) echo "you choose rem $val1 and $val2";
    val=$(rem $val1 $val2);
    echo "$val1 % $val2 = $val";
    ;;
    *) echo "chooseNum must little than 5"
    ;;
esac

运行结果:

# 加
# 命令: ./for.sh 1 2 4
you choose sum 2 and 4
2 + 4 = 6

# 减
# 命令: ./for.sh 2 3 4
you choose sub 3 and 4
3 - 4 = -1

# 乘
# 命令: ./for.sh 3 5 6
you choose mul 5 and 6
5 * 6 = 30

# 除
# 命令: ./for.sh 4 6 3
you choose div 6 and 3
6 / 3 = 2

# 求余
# 命令: ./for.sh 5 7 3
you choose rem 7 and 3
7 % 3 = 1

Shell 函数

#!/bin/bash
function sum(){
    val1=$1;
    val2=$2;
    val=$(($1+$2));
    echo ${val};
}
ret_val=$(sum 10 20);
echo $ret_val
# 输出 30

带有return的函数,可以在调用完函数后使用 $? 来获得函数返回值

Shell 文件包含

1、使用. ./***的形式在A shell文件中调用 B shell文件

2、使用 source ./***的形式在A shell文件中调用 B shell文件

#!/bin/bash
. ./delet_test.sh

运行结果和delet_test.sh相同

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 特别说明:以下内容来自简书,链接为原文出处,一切权益归原作者所有,在此感谢原作者的分享,大家可以点击以下链接查看原...
    沈祥佑阅读 553评论 0 4
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,744评论 0 10
  • 用了caffe有一段时间了,感觉自己写shell脚本的能力有待提高,特地从菜鸟笔记处系统的看了一遍,其实学习基础就...
    yichen_china阅读 1,822评论 2 30
  • shell脚本 先开坑,大略地学一下,学习重点放在bash上,有需求再认真的学习细节的内容 Shell 脚本(sh...
    喵喵小阳阅读 405评论 0 1