1.hello shell第一shell程序
shell用来解析命令,完成用户和内核的交互。我们可以通过shell脚本将多条命令结合起来,完成一些逻辑上的操作。通常shell脚本以.sh
后缀结尾,但不是必需的。我们来完成一个输出hello shell的脚本吧。我这里使用neovim,如果没有按照用vim或者vi都是可以的。
☁ new pwd
/home/xiyan/new
☁ new nvim hello.sh
#! /bin/bash
echo "hello shell"
上面就是简单的输出一个"hello shell",运行sh脚本有两种方式,可以通过 bash + 脚本名
,或者给脚本文件赋予可执行权限。bash是系统的一个shell,可以通过/etc/shells
文件查看系统支持的shell版本。
方式1
☁ new bash hello.sh
方式2
☁ new chmod 744 hello.sh
☁ new ./hello.sh
2.定义变量
shell脚本定义变量规范变量名要大写(不遵守也可以),它不用声明类型(和python定义是一样的)等号赋值时左右两边不能有空格(这就很麻烦!)。
NAME="iu"
AGE=18
如何要取出变量中的值可以使用 $
符号
#! /bin/bash
NAME="iu"
AGE=18
echo "the name is $NAME"
echo "the age is $AGE"
3.输入和输出
shell脚本中可以使用echo来输出,上面也一直在用。从命令行中输入可以使用read命令带上 -p可以带提示输入。
#! /bin/bash
echo "请输入你的名字 :"
read NAME
read -p "请输入你的年龄 : " AGE
echo "the name is $NAME"
echo "the age is $AGE"
4.算术运算符
在shell脚本中,算术运算需要带上expr
命令。例如:1 + 3需要 expr 3 + 1
并且运算符两边需要带上空格,在使用乘法的时候需要转义(\*
),另外如果想要将结果赋值给变量就需要用 (`` 括起来 : ~这个键)。常用运算符:(+
、-
、 \*
、 /
、 %
)
#! /bin/bash
NUM1=`expr 5 + 10`
echo "$NUM1"
NUM2=`expr 5 \* 10`
echo "$NUM2"
5.条件循环语句
1、if语句,if-else语句、if else-if else语句格式多用即可,唯一要注意的是空格!
if [ 条件 ]
then
命令
fi
-----------
if [ 条件 ]
then
命令
else
命令
fi
-----------
if [ 条件 ]
then
命令
elif [ 条件 ]
then
命令
else
命令
fi
1)判断用户名正不正确,假设用户名是root。
#! /bin/bash
read -p "请输入你的用户名 : " USER
if [ $USER = "root" ]
then
echo "user : $USER-用户名正确!"
else
echo "user : $USER-用户名错误!"
fi
2)实现输入一个整数,判断此整数是奇数还是偶数
#! /bin/bash
read -p "请输一个整数 : " NUM
if [ `expr $NUM % 2` -eq 0 ]
then
echo "这是一个偶数 : $NUM "
else
echo "这是一个奇数 : $NUM "
fi
对于字符串可以通过 == 或者 = 来判断是否相等。而数字做比较,有点难记。equals是等于、not是不、little 是小、而great是大,将它们组合起来。
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
3)提示输入一个目录文件名,判断是否存在,如果不存在创建,存在不创建。判断目录是否有写权限,如果有写权限,进入目录。进入目录后,提示输入要创建普通文件名字,判断普通文件是否存在,存在,不创建,不存在创建
-e 判断文件是否存在 不区分文件的类型 目录 普通文件
-d 判断目录文件是否存在
-f 判断普通文件是否存在
-r 判断文件是否有读权限
-w 判断文件是否有写权限
-x 判断文件是否有可执行权限
#! /bin/bash
read -p "请输入一个目录名:" DIR
if [ -d $DIR ]
then
echo "文件名为$DIR的目录已存在!"
else
mkdir $DIR
echo "已创建名为$DIR的目录!"
fi
if [ -w $DIR ]
then
cd $DIR
read -p "请输出要创建存在的文件名:" FILE
if [ -f $FILE ]
then
echo "要创建名为$FILE的普通文件已存在!"
else
touch $FILE
echo "已创建名为$FILE的文件!"
fi
else
echo "你没有$DIR的写权限!"
fi
2、while循环的基本语法。
while [ 条件 ]
do
命令
done
1)实现1-100的求和。
#! /bin/bash
NUM=1
SUM=0
while [ $NUM -le 100 ]
do
SUM=`expr $SUM + $NUM`
NUM=`expr $NUM + 1`
done
echo "$SUM"
3、for循环的基本语法
for var in 列表
do
命令
done
1)输出1-10,这里关键的一点是定义一个列表。用一对 "1 2 3 4 5"中间用空格隔开。
#! /bin/bash
LIST="1 2 3 4 5 6 7 8 9 10"
for E in $LIST
do
echo $E
done
2)for循环实现将a文件夹中的所有文件copy到b文件夹中。如果这里要实现这个题目,首先要知道 # 、1 、2代表什么意思。# 代表系统要输入多少个参数。1表示第一个参数、而2表示第二参数。
☁ new tree
.
├── a
│ ├── a.tx
│ ├── a.txt
│ └── c
└── hello.sh
#! /bin/bash
if [ $# -ne 2 ]
then
echo "你的命令错误,用法:命令 参数1 参数2"
exit
fi
if [ -d $1 ]
then
if [ -d $2 ]
then
echo "$2已存在!"
else
mkdir $2
echo "$2创建成功!"
fi
LIST=`ls $1`
for E in $LIST
do
cp -r $1/$E $2
done
else
echo "你输入的$1不存在!"
fi
☁ new bash hello.sh a b
b创建成功!
☁ new tree
.
├── a
│ ├── a.tx
│ ├── a.txt
│ └── c
├── b
│ ├── a.tx
│ ├── a.txt
│ └── c
└── hello.sh
4、case … esac基本语法
case 值 in
模式1)
执行命令
;;
模式2)
执行命令
;;
模式*)
上面分支都不满足时执行的命令
;;
esac
1)使用case … esac实现一个简单的计算器
#! /bin/bash
read -p "请输入第一个整数: " NUM1
read -p "请输入一个运算符: " OP
read -p "请输入第二个整数: " NUM2
case "$OP" in
+)
echo "$NUM1 + $NUM2 = `expr $NUM1 + $NUM2`"
;;
-)
echo "$NUM1 - $NUM2 = `expr $NUM1 - $NUM2`"
;;
\*)
echo "$NUM1 * $NUM2 = `expr $NUM1 \* $NUM2`"
;;
/)
echo "$NUM1 / $NUM2 = `expr $NUM1 / $NUM2`"
;;
*)
echo "你输入的运算符有误!"
;;
esac