SHELL学习笔记(二)LINUX中的SHELL

文章介绍了如何创建和运行Shell脚本,包括使用vi编辑器、脚本的三种执行方法以及权限设置。讲解了Shell中的helloworld程序,强调了第一行指定解释器的重要性。此外,文章详细阐述了Shell中的变量定义与引用,以及无引用、单引号和双引号的使用区别。还讨论了if判断语句和for、while循环的用法,包括逻辑运算符和条件判断。最后提到了echo指令、case语句以及shell程序的参数传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.shell脚本的创建与编译

编辑器、编译器、运行方法(脚本的3种执行方法)

(1)shell程序是文本格式的,只要是文本编辑器都可以。但是因为我们的shell是要在linux系统下运行的,所以换行符必须是'\n',而windows下的换行符是"\r\n",因此windows中的编辑器

写的shell不能在linux下运行。所以我们整个课程都是在linux下使用vi编辑器(实际上是vim)进行编写调试的。

(2)编译器  不涉及,因为shell是解释性语言,直接编辑完就可以运行。

(3)shell程序运行的运行有多种方法,这里介绍三种方法:

第一种:./xx.sh,和运行二进制可执行程序方法一样。这样运行shell要求shell程序必须具有可执行权限。chmod a+x xx.sh来添加可执行权限。

第二种:source xx.sh,source是linux的一个命令,这个命令就是用来执行脚本程序的。这样运行不需要脚本具有可执行权限

第三种:bash xx.sh,bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了bash程序,然后把xx.sh作为argv[1]传给他运行。

hello world程序和解释

(1)shell程序的第一行一般都是: #!/bin/sh                这行话以#!开始,后面加上一个pathname,这行话的意思就是指定shell程序执行时被哪个解释器解释执行。所以我们这里写

上/bin/sh意思就是这个shell将来被当前机器中/bin目录下的sh可执行程序执行。

可以将第一行写为:#!/bin/bash来指定使用bash执行该脚本。

注意:在ubuntu上面默认使用的解释器sh其实不是bash,而是dash。dash是ubuntu中默认使用的脚本解释器。

(2)脚本中的注释使用#,#开头的行是注释行。如果有多行需要注释,每行前面都要加#。(#就相当于是C语言中的//)

echo为输出指令

echo"hello world"

2.shell编程学习1

shell中使用linux命令

练习:当前目录下创建文件夹dir,dir下创建文件b.txt

#!/bin/sh

#comment

#test1

mkdir shell_test

cd shell_test

touch a.txt

cd ..

其实就是把Linux命令行里的语句写到.sh中

shell中的变量定义和引用

(1)变量定义和初始化。shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C语言不同。在shell编程中定义变量不需要制

定类型,也没有类型这个概念。

(2)变量定义时可以初始化,使用=进行初始化赋值。shell中赋值的=两边是不能有空格的

注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。

(3)变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的

值。

(4)变量引用。shell中引用一个变量必须使用$符号,$符号就是变量解引用符号

#!/bin/sh

#comment

#test1

string='name'

echo $string

注意$符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的

变量其实就相当于是一个定义并赋值为空的变量。

注意:变量引用的时候可以$var,也可以${var}。这两种的区别是在某些情况下只能用${var}而不能简单的$var

如果调用echo  $varyou   则此时是错误的,寻找不到varyou变量,此时只能使用echo ${var}you

shell中无引用、单引号和双引号的区别

(1)shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以,但是缺陷是不能输出"或者其他转义字符

(2)shell中也可以使用单引号来表示字符串,单引号中有什么就输出什么。

(3)单引号中:完全字面替换(不可包含单引号本身)

(4)双引号中:

$加变量名可以取变量的值

反引号仍表示命令替换

\$表示$的字面值                        输出$符号

\`表示`的字面值      输出'

\"表示"的字面值

\\表示\的字面值      输出\

除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。

3.shell中的if判断语句

shell中调用linux命令

(1)直接执行

(2)反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来

调用执行命令。

#test1

string=`pwd`

echo "pathway is $string"

echo `pwd`

echo 'pathway is $string'

shell中的选择分支结构

典型if语言格式

if [表达式]; then

        xxx

        yyy

        zzz

else

        xxx

        ddd

        uuu

fi

if的典型应用

判断文件是否存在。-f),注意[]里面前后都有空格,不能省略

#test1

string=`pwd`

if [  -f $string  ];then

        echo "ok"

else

        echo "not ok"

fi

判断目录是否存在  (-d)

判断字符串是否相等("str1"  =  "str2"),注意用一个等号而不是两个      两个字符串与等号间要有空格

if [ "good"  =  "bad" ];then

判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)                

回忆一下在ARM裸机中讲述ARM汇编条件执行时,曾经用过这些条件判断的缩写。(eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)

if [ 12 -eq 12 ];then

        echo "a"

else

        echo "not ok"

fi

判断字符串是否为空(-z)注意-z判断时如果变量本身没定义也是不成立(也就是说-z认为没定义不等于为空)

if [ -z $string ];then

        echo "a"

else

        echo "not ok"

fi

(4)if判断式中使用“-o”表示逻辑或

相当于C语言中在if后面的条件式中用逻辑与、逻辑或来连接2个式子,最终的if中是否成立取决于2个式子的逻辑运算结果。

if [ 12 -eq 13 -o 5 -gt 6 ];

(5)逻辑与&&和逻辑或||与简写的if表达式相结合

[ $string="bad" ] && echo "good"

很简便很常用

4.shell中的for循环

For I in `ls`

Do

Echo $i

Done

for循环遍历文件夹中的文件

C风格的for循环

 for ((i=0;i<5;i++));         #这里是两层小括号,且要有分号

 do

        echo $i

 done

python风格的for循环

 for i in {0..20..5};                  #类似于python中的range(),分隔符为..

 do

        echo $i

 done

5.shell中的while循环

i=1

j=10

 while [  $i -lt $j  ]

 do

        echo $i

        i=$(($i+1))

 done

要注意很多格式要求,譬如:while后面的[]两边都有空格,[]后面有分号分号(如果do放在一行的话),i++的写法中有两层括号

如果要调用相关变量则需要$

6.shell中其他注意的点

echo在当前目录创建和追加输入文件

echo 'test' > a.txt

echo 'buffer' >> a.txt

(1)在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>。

(2)还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容

                 

case语句

(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异

(2)shell中的case语句天生没有break,也不需要break,和C语言中的switch case不同。shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就好像shell

中的case语言默认都带了break

var=2

case $var in

1) echo "1";;

2) echo "2";;

esac

调用shell程序的传参

shell程序本身也可以在调用时传参给他。在shell程序内部使用传参也是使用的一些特定符号来表示的,包括:

$#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数)

$0、$1、$2·····则依次表示传参的各个参数。

shell:source a.sh aa bb cc         $# = 3, $0是执行这个shell程序的解析程序的名字,$1是第一个有效参数的值,$2是第2个有效参数的值·····

#pass three parameter

echo $# $0 $1 $2 $3

返回3 bash aa bb cc

while循环和case语言和传参结合

(1)shell中的break关键字和C语言中意义相同(都是跳出)但是用法不同。因为shell中case语句默认不用break的,因此在shell中break只用于循环跳出。所以当while中内嵌case语句时,

case中的break是跳出外层的while循环的,不是用来跳出case语句的。

(2)shell中的$# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,原来的$2变成了新的

$1,原来的$#少了1个。

APPEND=no

BOARD_NAME=""

while [ $# -gt 0 ] ; do

        case "$1"  in

        --) shift; break;;

        -a) shift;APPEND=yes;;

        -n) shift;BOARD_NAME="${1%%_config}" ;shift;;

        *) break;;

        esac

done

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值