目录
一、基本知识
二、 shell的变量和赋值
1、注意
2、变量的种类
3、例子
三、特殊符号
1、单引号、双引号、反引号
2、管道
3、大于号>和小于号<(重定向)
(1)常识
(2)应用(描述符在右边的时候,应该加上&符号)
(3)>和>>的区别
四、字符串操作
1、计算字符数
2、删除字符串左边部分字符
3、删除字符串右边的字符
五、测试语句
六、逻辑语句
1、if-elif
2、多路分支
3、for循环
一、基本知识
- shell是解析型语言,不需要编译器编译
- #!/bin/bash:表示用/bin/bash工具编译
二、 shell的变量和赋值
1、注意
(1)Shell在赋值的时候两边没有空格
(2)shell右边是单词组的时候,必须有双引号
(3)变量的格式跟C语言一样
2、变量的种类
3、例子
hello.sh中
echo "参数个数:"$# //3
echo "所有参数@" $@ //123 hi hhh
echo "所有参数*" $* //123 hi hhh
echo "上一条shell命令的返回值*" $? // 0
echo "第三个参数*" $3 //hhh
在命令行中输出
./hello.sh 123 hi hhh
三、特殊符号
1、单引号、双引号、反引号
2、管道
ls -l | wc当中,ls -l收集当前目录下文件的信息,然后送给管道,wc从管道读出来,计算出行数、单词个数和总字符
3、大于号>和小于号<(重定向)
(1)常识
进程在运行的时候系统回打开三个文件,为标准输入(0),标准输出(1)(显示屏显示的是从1号描述符中读出来的),标准出错(2)
(2)应用(描述符在右边的时候,应该加上&符号)
ls -l 1>a.txt | 本来命令是要输出到1号描述符,重定向后输出到a.txt |
echo 0<b.doc | 原本从键盘读取文件,现在变为从b.doc读取数据 |
echo “hello world” 1>&2: | Hello world原本要输入到1号描述符,变成输出到2号描述符 即将一句话输出到标准出错设备中去 |
cat > name | 从标准输入中获取信息,并直接写入到文件name中 |
Cat >name <a.txt | 把a.txt的内容作为输入,然后>输出到name |
(3)>和>>的区别
>,文件存在,删除重新创建
>>,文件存在则追加
四、字符串操作
1、计算字符数
time="today is `date`"
echo "time 的字符数: ${#time}"
2、删除字符串左边部分字符
path="/etc/rc0.d/Z20openbsd-inetd"
level=${path#/etc/rc[0-9].d/[AZJ]}
echo $level (输出:20openbsd-inetd)
3、删除字符串右边的字符
path="/etc/rc0.d/Z20openbsd-inetd"
vel=${level%%[a-zA-Z]*}
echo $vel (输出:/etc/rc0.d/Z20)(特殊符号不在考虑范围内,例如当中的”-“)
五、测试语句
六、逻辑语句
1、if-elif
字符串是否相等 | if [ "$var1" = "$var2" ] |
文件是否存在并可读 | if test -e name && test -r name |
文件是否存在并可读 | if [ -e name ] && [ -r name ] |
if [ -e file ] && [ -r file ] then cat file # 如果文件存在且可读,则显示该文件内容 elif [ -e file ] # 判断文件是否存在 then chmod u+r file # 让用户的权限添加可读 cat file # 如果文件存在但不可读,则加了读权限之后再显示其内容 else touch file # 如果文件不存在,则创建该空文件 fi |
2、多路分支
read VAR # 从键盘接收一个用户输入 case $VAR in # 判断用户输入的值$VAR 1) echo "one" # 如果$VAR 的值为 1,则显示 one ;; # 每个分支都必须以双分号作为结束(最后一个分支除外)类似于break 2) echo "two" ;; *) echo "unknown" # 星号*是 Shell 中的通配符,代表任意字符。 esac |
注意事项: 1、变量 VAR 的值实际上是字符串,因此上述代码中的 1) 也可写成 “1”) 2、整个 case 结构必须 esac 作为结束。 |
问题:”\r“:command not found 编辑器结束符号有两种
|
3、for循环
files=`ls` # 在当前目录下执行 ls,将所有的文件名保存在变量 files 中 for a in $files # 循环地将 files 里面的每个单词赋给 a,赋完则退出循环 do if [ -f $a ] # 如果文件$a 是一个普通文件,那么就计算他的行数 then wc -l $a fi done |