shell介绍和命令实例

shell
shell是操作系统的终端命令行,
可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式。
我们可以使用shell和操作系统、uboot等软件系统进行交互,具体来说就是我们通过shell给软件系统输入命令然后回车执行。
shell是一类编程语言,编写shell脚本时使用的语言就是shell语言,又叫脚本语言。shell脚本其实是一类语言而不是一个语言,常用shell语言:sh、bash、csh、ksh、perl、python等。在linux下常用的脚本语言其实就是bash、sh;而perl、python这样的高级shell脚本语言,常用在网络管理配置等领域,系统运维人员一般要学习这些。脚本语言一般在嵌入式中应用,主要是用来做配置,(一个复杂的嵌入式程序都是可配置的,配置过程就是用脚本语言来实现的)自然不会使用过于复杂的脚本语言特性。linux下最常用的脚本就是bash。

shell脚本的运行机制:解释运行
(1)C语言(C++)这种编写过程是:编写出源代码(源代码是不能直接运行的)然后编译链接形成可执行二进制程序,然后才能运行;而脚本程序不同,脚本程序编写好后源代码即可直接运行( 没有编译链接过程
(2)shell程序是 解释运行的,所谓解释运行就是说当我们执行一个shell程序时,shell解析器会逐行的解释shell程序代码,然后一行一行的去运行。(顺序结构)
(3)CPU实际只认识二进制代码,根本不认识源代码。脚本程序源代码其实也不是二进制代码,CPU也不认识,也不能直接执行。只不过脚本程序的编译链接过程不是以脚本程序源代码为单位进行的,而是在脚本运行过程中逐行的解释执行时才去完成脚本程序源代码转成二进制的过程(不一定是编译链接,因为这行脚本程序可能早就编译连接好了,这里我们只是调用它)。

shell中的变量定义和引用
(1)变量定义和初始化。shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。
(2)变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。
注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。
(3)变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。
(4)变量引用。shell中引用一个变量必须使用$符号,$符号就是变量解引用符号。
注意:$符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。

说明:
(1)shell程序的第一行一般都是: #!/bin/sh 这行话以#!开始,后面加上一个pathname,这行话的意思就是指定shell程序执行时被哪个解释器解释执行。所以我们这里写上/bin/sh意思就是这个shell将来被当前机器中/bin目录下的sh可执行程序执行。
可以将第一行写为:#!/bin/bash来指定使用bash执行该脚本。
注意:在ubuntu上面默认使用的解释器sh其实不是bash,而是dash。dash是ubuntu中默认使用的脚本解释器。
(2)脚本中的注释使用#,#开头的行是注释行。如果有多行需要注释,每行前面都要加#。(#就相当于是C语言中的//)
(3)shell程序的正文,由很多行shell语句构成。
(4)shell就是把以前命令行中键入执行的命令写成了程序。shell其实就是为了避免反复的在命令行下手工输入而发明的一种把手工输入步骤记录下来,然后通过执行shell脚本程序就能再次复述原来记录的手工输入过程的一种技术。


实例1、echo命令输出
#!/bin/sh                                   //规定的解释器目录格式
# test1注释
echo "hello world."                   //用echo命令输出hello world
# test2注释
string="hello world"
string="new string"
echo $string                               //只输出最新的string内容,即"new string"      
#test3注释
var="\$abbb\$"                       //双引号,输出反义字符,$abc$
var='\$abbb\$'                         //单引号,原样输出,即 \$abbb\$
echo $var
#test4注释
var=hello
echo "$var you"                         //输出hello you
echo "$varyou"                         //没输出东西, $后接变量,这里被认为是varyou变量,没定义则为空
echo "${var} you"                     //大括号,可输出hello you
test5注释
MYPATH=" `pwd`/include"     //反引号,输出当前路径/include
echo "MYPATH=$MYPATH"

实例2、创建文件和文件夹
#!/bin/sh       
#test1注释
touch pp.txt                             //创建一个.txt文件
#test2注释
mkdir pp                                 //创建一个目录,里面包含一个文件
cd pp
touch pp.c
cd ..

实例3、用echo命令和>符号创建文件,和用>>符号追加文件内容
#!/bin/sh
#test1注释
echo "test" > a.txt                   //创建a.txt文件,并在里面写入“test”内容
#test2注释
echo "include
int main ()
{
return 0;
}
" > a.c                                       //创建a.c文件,并在里面写入一段程序代码
#test3注释
echo "zengjianpai" >> a.c     //在上面程序代码中追加写入内容

实例4、if语句
#!/bin/sh
#test1注释
if [ -f a.c ];then                            //检查是否存在文件
echo "yes"
else 
echo "no"
touch a.c
fi                                               //语句结束标志
#test2注释
if [ 122 -gt 12 ];then               //比较大小:le小于或等于,lt小于;ge大于或等于,gt大于
echo "equal"
else
echo "not equal"
fi
#test3注释
if [ "abc" = "abc" ];then         // 比较字符串是否相等
echo "equal"
else
echo "not equal"
fi
#test4注释
str="pp"                  
if [ -z $str ];then                                         // 检查str是否为空,-z表示zero
echo "yes"
else 
echo "no"
fi
test5注释
if [ 122 -eq 12 -o "abc" = "abcd" ];then       //-eq表示相等;-o表示或,连接两个条件
echo "yes"
else 
echo "no"
fi

实例5、与&&、或||语句
str=""
[ -z $str ] || echo "fei kong"             //逻辑或,如果条件成立,则不执行echo指令
[ -z $str ] && echo "kong"           //逻辑与,如果条件成立,则执行echo指令

实例6、循环for、while语句
#!/bin/sh
test1注释
for i in 1 2 3 4 5
for i in `ls`                                                  //反引号,可执行里面的命令
do
echo $i                                     //显示1、2、3、4、5
done                                 //循环语句结束符
test2注释
i=1
j=10
while [ $i -lt $j ]               //判断i 是否小于j
do
echo $i                                   //成立的话则输出
i=$(($i+1))                                        //格式规定这样,相当于C语言的i++
done

实例7、case语句
#!/bin/sh
var=2
case $var in
1) echo "1" ;;                   //case语句,shell中默认有break功能, 和while结合使用时表示退出while循环
2) echo "2" ;;
esac                                 //case语句结束符

实例8、 $#是传参个数,$0,$1等是参数
#!/bin/sh
#test1注释
echo $# $0 $1 $2 $3       //退出编辑后,在命令行输入./pp.sh aa bb cc,显示"3 ./case.sh aa bb cc"
                                        //$0存的是程序的文件执行名,$#是真实参数的个数

此项拓展:
C语言:./a.out aa bb cc argc = 4, argv[0] = ./a.out, argv[1]是第一个有效参数····
shell:source a.sh aa bb cc   $# = 3, $0是执行这个shell程序的解析程序的名字,$1是第一个有效参数的值,$2是第2个有效参数的值
结论: $#计数时只考虑真正的参数个数

#test2注释
echo $# $1
shift;
echo $# $1
执行命令./case.sh aa bb cc 后,输出:
3 aa
2 bb
说明:shell中的$# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,原来的$2变成了新的$1,原来的$#少了1个。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值