shell与shellscript
shell变量的设置规则
- 变量与变量内容通过一个等号”=”连接,注意等号两边不能直接 接空格符
- 变量只包括英文与数字, 且开头字符不能是数字
变量内容右空格符可使用双引号或单引号将变量内容结合起来,也就是说单引号或者双引号包含的内容为一个整体,但是值得注意的是
- 双引号中的特殊字符将会被翻译成原文,例如 var = “lang is $LANG”,则此时$ LANG将被翻译成lans is en_US;
- 而单引号的特殊符号则将被保持为原样。
转移字符”\”将特殊符号转为一般字符
在一串命令中,还需要通过其他的命令提供的信息,可以使用反单引号(注意不是单引号)“`命令`”)或” $(命令)”
1
version= $(uname -r)
若该变量为了增加变量内容时,则可用”$变量名称”或${变量}累加内容
1
PATH="$PATH":/home/bin
若该变变量需要在其他子进程中执行,则需要以export来使变量变成环境变量
export PATH
- 取消变量的方法为使用”unset变量名称”
常见例子
1
2
3
4
5
6
7#在PATH环境变量中累加
PATH=$PATH:/home/louis/bin
PATH="$PATH":/home/louis/bin
PATH=${PATH}:/home/louis/bin
#将name变量的内容多输出yes
name="$name"yes
name=${name}yes
反单引号`的使用例子(在一串命令中,在`之内的命令将会被先执行,其执行的结果将会作为外部的输出信息)
1 | ls -l `loacet crontab` |
变量内容的删除、替代与替换
变量设置方式 | 说明 |
---|---|
\${变量#关键字} | 若变量内容从头开始的数据符合”关键字”,则将符合的最短数据 删除 |
\${变量##关键字} | 若变量内容从头开始的数据符合”关键字”,则将符合的最长数据删除 |
\${变量%关键字} | 若变量内容从尾开始的数据符合”关键字”,则将符合的最短数据删除 |
\${变量%%关键字} | 若变量内容从尾开始的数据符合”关键字”,则将符合的最长数据删除 |
\${变量/旧字符串/新字符串} | 若变量内容符合”旧字符串”,则第一个旧字符串会被新字符串替换 |
${变量//旧字符串/新字符串} | 若变量内容符合”旧字符串”,则全部的旧字符串会被新字符串替换 |
通配符与特殊符号
符号 | 意义 |
* | 代表0到无穷多个任意字符 |
? | 代表一定有一个任意字符 |
[] | 同样代表一定有一个在中括号内的字符(非任意字符)。例如[abcd]代表一定有一个字符,可能是a,b,c,d这四个任何一个 |
[-] | 若有减号在中括号时,代表在编码顺序内的所有字符。例如[0-9]代表0到9之间的所有数字,因为数字的语系编码是连续的 |
[^] | 若中括号内的第一个字符为指数符号^,例如[^abd]代表一定有一个字符,只要是非a,b,c的其他字符就接受的意思 |
特殊字符
# 批注符号,注释
\ 转义符号
; 连续命令的分隔符
| 管道
`` ``中间的命令可以先执行
数据流重定向
- 标准输入(stdin):文件描述符为0,使用<或<<;
- 标准输出(stdout): 文件描述码为1, 使用>或>>;
- 标准错误输出(stderr): 文件描述码为2, 使用2>或者2>>.
标准输出和标准错误
- 1>: 以覆盖的方法将正确的数据输出到指定的文件或设备上
- 1>>: 以追加的方法将正确的数据输出到指定的文件或设备上
- 2>: 以覆盖的方法将错误的数据输出到指定的文件或设备上
- 2>>: 以追加的方法将错误的数据输出到指定的文件或设备上
1 | find /home -name anyname > list_right 2>list_err |
/dev/null 垃圾黑洞
1 | #将全部数据均写到一个文件中去 |
标准输入
将原本需要键盘输入的数据右文件内容代替1
2
3
4
5
6
7
8#创建catfile,从标准输入读取内容到catfile中,文件以[ctrl]+d结束
cat > catfile
#从.bashrc中读取内容
cat > catfile < ~/.bashrc
#从标准输入读取内容,输入关键字eof结束
cat > catfile <<"eof"