Shell从入门到放弃

1、什么是Shell?

shell 由C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一个程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核服务。

Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
一般我们说的Shell是指shell脚本。

Unix系统中常见的shell有:sh、csh、ksh、tcsh、bash。

2、基本常识

shell脚本必须以 #!/bin/bash 开头。
以#开通的行表示注释,会被解释器忽略。
例如:test.sh

#!/bin/bash
for i in 1 2 3 4 5 
do 
 echo "The value is :$i"
done

执行:

chmod +x test.sh #使该脚本具有执行权限
./test.sh      #执行脚本
/bin/sh test.sh  # 或者,作为解释器参数执行

3、常见语法

变量的定义与赋值
规范
  • 首字母必须为字母
  • 中间不能有空格
  • 不能使用标点符号
  • 不能使用bash里的关键字
赋值

变量没有默认值,所有必须在定义是赋初始值。

#!/bin/bash
MYNAME=Metre
echo ${MYNAME}

注意:等号前后不能有空格。

向Shell传参数

$数字: 表示第几个参数(0,表示执行的文件名)。

为脚本设置可执行权限,并执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传到脚本的参数个数
$* 以字符串的方式传递所有参数到脚本
$$ 脚本运行的当前进程ID
$! 后台运行的最后一个进程ID
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的推出状态。0表示没有错误,其他任何值表明有错误。
运算符

运算符之间一定要有空格,例如 1+1 是错的。必须写成 1 + 1

关系运算符
运算符 说明
-eq 检测两个数是否相等,相等返回true 例如: if [ $a -eq xx ]
-ne 检测两个数是否相等,不相等返回true
-gt 检测左边的数是否大于右边的数,如果是,返回true
-lt 检测左边的数是否小于右边的数,如果是,返回true
-ge 检测左边的数是否大于等于右边的数,如果是,返回true
-le 检测左边的数是否小于等于右边的数,如果是,返回true
布尔运算符
运算符 说明
&& 逻辑与
两竖 逻辑或
字符串运算符
运算符 说明
= 检测两个字符串是否相等,相等返回true
!= 检测两个字符串是否相等,不相等返回true
-z 检测字符串长度是否为0,为0返回true
-n 检测字符串长度是否为0,不为0返回true
str 检测字符串是否为空,不为空返回true 。例如 :n=“abc” if[$a] 返回true
流程控制

if语句 和 for循环 和 while 循环。

#!/bin/bash
a=2 #变量
b=2  #变量
#if语句
if [ $a == $b ]  #注意空格   if 和 [ 和 $a 和 == 之间都必须有空格。
then   
    echo "a 等于 b"
elif [ $a -lt $b ]
then
    echo "a 小于 b"
else
    echo "a 大于 b"
fi #fi结束

for i in 1 6 7 8 # for循环
do
    echo "for1 The value is:${i}"
    #加入判断
    if [ ${i} == 7 ]
    then
        echo 'break'
        break #跳出循环
    fi

  #加入判断
  if [ ${i} -ge 6 ]
  then
      echo 'continue'  
      continue #跳过本次循环执行下一次。
    fi
done

#循环的另外一种写法
for (( i=1;i<=2;i++ ))
do
    echo "for2 ${i}"
done

#while循环。
index=0
while(($index <=3))
do
    echo "while ${index}"
let "index++"
done

执行结果:

a 等于 b
for1 The value is:1
for1 The value is:6
continue
for1 The value is:7
break
for2 1
for2 2
while 0
while 1
while 2
while 3

无限循环:

while true
do
#执行业务
done

while  :
do
#执行业务
done
变量引用

引用shell变量要用$符号,并加{},以防止歧义。
例如:


引用案例
声明变量

声明变量时,不能有空格,必须要有默认值。


案例
单引号和双引号

二者都可以标识字符串,不同的是,单引号只能表示字符串,而双引号可以引用变量或特殊函数。


例子
命令代换

反引号`` 或者 $(),其中的内容,会以命令的方式执行。

[root@jcsrv-110 home]# echo `sldf`
bash: sldf: command not found
例子
算数代换:$(())
[root@jcsrv-110 home]# SB=$((2+1))
[root@jcsrv-110 home]# echo ${SB}
3
[root@jcsrv-110 home]# 
数组
ar=(a 1 3 b 4 s) #定义数组
i=1 #变量
ar[${i}]=abc # 重新赋值
echo "数下标${i}的值为:${ar[i]}" # 输出
文件测试运算符
file="/home/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi

文件测试运算符用于检测 Unix 文件的各种属性。属性检测描述如下 :

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
函数定义:
[root@jcsrv-110 home]# vi funtest.sh 
#!/bin/bash

funAddNum(){  #定义函数
    echo "该函数对输入的两个数字进行相加运算...."
    printf "请输入第一个数字:"
    read anum  #控制台输入
    echo "请输入第二个数字:"
    read bnum  #控制台输入
    echo "两个数字分别为 ${anum} 和 ${bnum}"
    return $(($anum + $bnum))
}

funAddNum # 调用函数
echo "输入的两个数字之和为: $? " # $?获取函数返回。

输入结果:

[root@jcsrv-110 home]# ./funtest.sh 
该函数对输入的两个数字进行相加运算....
请输入第一个数字:1
请输入第二个数字:
3
两个数字分别为 1 和 3
输入的两个数字之和为: 4 
带参函数:
[root@jcsrv-110 home]# vi funParam.sh 
#!/bin/bash

funByParam(){
    echo "第一个参数: $1"
    echo "第二个参数: $2"
    echo "第五个参数: ${5}"
    echo "参数总数为: $# 个"
    echo "输入所有参数: $* "
}
funByParam 1 4 3 4 25 656 44  #传参调用.

输出结果:

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

推荐阅读更多精彩内容