shell简单用法归纳
文章目录
shell是一种脚本语言,sh、bash、python等都是脚本语言
在ubuntu中默认的脚本语言解释器是dash(sh),通过ls /bin/sh -l查看,其中第一句就是指定解释器,比如创建一个hello.sh
#!/bin/sh
# 这里是注释
echo "hello world!"
./hello.sh
输出
hello world!
shell中变量简单定义和引用
- 变量定义和初始化。shell是弱类型语言(语言中变量如果有明确的类型定义则属于强类型语言;反之就是弱类型语言)和C语言不同。在shell中定义变量不需要指定类型
- 变量的赋值:用“ = ”号
注意:变量的赋值两边是不能有空格的 - 变量引用:“ $ ”符号就是变量的解引用符号
注意:$后面跟一个字符串,这个字符串就会被当做变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有定义的变量就相当是一个定义并赋值为空的变量。
#!/bin/sh
# variable define & use
string="hello world"
echo $string
结果
hello world
shell中单引号和双引号、无引号区别
(1)单引号:完全字面替换(不可包含单引号本身)
(2)双引号: $加变量名可以取变量值
反引号仍表示命令命令替换
\ $表示 $的字面值
\ ‘ 表示 ’ 的字面值
\ “表示 ” 的字面值
\ \ 表示 / 的字面值
除以上情况之外,在其它字符前面的
(3)shell中使用字符串可以不加引号,直接使用。而且有空格的时候也可以,但是缺陷是不能输出“或其它转义字符。
shell中调用LInux中的命令
(1)直接执行
(2)反引号括起来(ESC下面的一个按键)。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号来调用执行。
#!/bin/sh
TOUCH=`touch` #定义一个变量
MYPATH=`pwd`/include
mkdir dir#直接执行
$TOUCH a.c
echo "MYPATH = $MYPATH"
输出结果创建一个dir文件夹,创建一个a.c文件,echo "MYPATH = $MYPATH"这句输出的是一个绝对路径
shell中的选择分支结构
(1)shell中if用法非常多,在此只介绍常用
(2)典型 if 表达式
if [表达式]; then
xxx
else
xxx
fi
(3)if的典型应用
判断文件是否存在(-f),注意[ ]中的空格必须
判断目录是否存在(-d)
判断字符串是否相等(“str1” = “str2”)
判断数字是否相等(-eq)、大于(gt)、小于(lt)、大于等于(ge)、小于等于(-le)
(ARM汇编条件执行时,用过条件判断缩写eq就是equal,gt就是greater than,lt就是less than,ge 就是greater or equal,le就是less or equal)
判断字符串是否为空(-z),注意如果变量本身没有定义也是不成立的
#!/bin/sh
#判断文件a.c是否存在,如果不存在则创建
if [ -f a.c ]; then
echo "yes"
else
echo "no"
touch a.c
fi
当前目录下没有a.c,执行两次该脚本输出
no
yes
(4)if判断式中使用“-o”表示逻辑或
相当于c语言中在if后面的条件式中用逻辑与、逻辑或来连接两个式子,最终if中是否成立取决于两个式子的逻辑运算结果。
#!/bin/sh
if [ 12 -eq 12 -o "abcd" = "abcd" ]; then
echo "yes"
else
echo "no"
fi
输出
yes
(5)逻辑与&&和逻辑或||与简写的if表达式相结合
#!/bin/sh
# 简写的if表达式
str=""
[ -z $str ] || echo "fei kong"#该变量str 必须先存在
执行后没有输出
#!/bin/sh
# 简写的if表达式
str="aaa"
[ -z $str ] || echo "fei kong"#该变量str 必须先存在
输出
fei kong
shell中循环结构
#!/bin/sh
#循环结构演示
#for i in `ls` #与当前目录使用ls一样
for i in 1 2 3 4 5
do
echo $i
done
输出
1
2
3
4
5
#/bin/sh
# 循环结构演示
i=1
j=6
#while [ $i -lt $j ]
#do
while [ $i -lt $j ]; do
echo $i
i=$(($i+1))
done
输出
1
2
3
4
5
echo的创建和追加输入文件
#!/bin/sh
# echo简单使用
# echo指令创建文件并添加内容
echo "#include <stdio.h>
int main(void)
{
return 0;
}" > a.c
# echo指令向已经存在的文件中追加输入内容
echo "追加的内容" >> a.c
输出创建了一个a.c其中内容
#include <stdio.h>
int main(void)
{
return 0;
}
追加的内容
表示创建文件,>>表示追加
shell中其它值得关注的知识点
1、case语句
case语句和c语言中switch case语句一样
#!/bin/sh
# case
var=2
case $var in
1) echo "1" ;;
2) echo "2" ;;
esac
输出
2
shell中case语句没有break,默认每句后面都有break
2、调用shell程序传参
(1)shell程序本身可以在调用时传参给她,在shell程序内部使用传参也是使用一些特定符号来表示,包括
$#表示调用该shell时传参的各个参数
$0、$1、$2…则依次表示传参的各个参数。
#!/bin/sh
# 传参演示
echo $# $0 $1 $2 $3
执行该脚本
source test.sh aa bb cc
输出
3 bash aa bb cc
$0是执行这个shell程序的解析程序的名字,$1是第一个有效参数的值
3、while和case和传参结合
(1)shell中的break关键字和C语言中意义相同,但是用法不同,因为shell中case语句默认不用break,因此shell中break只用于循环跳出,所以当while中内嵌case语句时,case中的break是跳出循环而不是用来跳出case语句
#!/bin/sh
# ...此处省略部分代码
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
esac
done
# ...此处省略部分代码
(2)shell中的 $# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。
#!/bin/sh
echo $# $1
shift
echo $# $1
执行该脚本
source test.sh aa bb cc
输出
3 aa
2 bb
shift指令有点像左移运算符
4、shell中的 | 叫做管道,管道的作用就是把管道前面一个运算式的输出作为后面一个的输入再去做处理,最终的输出才是我们整个式子的输出。