写第一个bash脚本遇到的问题以及解决方案
1 变量的定义和使用
变量的定义很简单,不需要类型声明。但是注意
- 给变量赋值的时候 等号两端 不应该有空格。否则出错。
- 变量的赋值如果使用另外变量的话,应该使用$()将其括起来
- 变量的赋值还可以是 一个命令的输出,前提也是必须用$()括起来。来说明不是一个简单的字符串
变量的使用也很简单,需要注意
- 必须加$,可以使用${},时候后者可以使用一些其他的功能,包括我将会讲到的字符串的截取
2 变量为字符串的时候,怎样进行截取
- 使用${variable:A:B}的格式,来截取使用下标来固定的字串
- A代表开始位置的下表。最好不要省略。也可以是
0-n
的格式,表示从后面数多少个 - B代表子字符串长度。省略的话,连 : 也不要写,表示到最后。
- A代表开始位置的下表。最好不要省略。也可以是
- 使用${varibale:#},${varibale:##}, ${varibale:%}, ${varibale:%%}来按照通配符进行匹配。详情自己查。
- 使用cut来截取。适合那种 格式严格,有多行 的字符串。比如/etc/passwd的内容
- 另外:
- 使用${#varibale}可以查看变量的长度
- 字符串的拼接直接重新赋值,拼接内容跟在变量后面即可。不需要加+运算符
3 字符串的处理替换等操作
使用sed命令进行处理,sed意思为stream editor ,可以对字符串流进行编辑操作。,格式为 sed command 文件名
。以行为单位,讲一行放在一个缓存区域,称之为pattern space。
- command
command 包括两个部分:- 处理范围 使用数字表示行数。如1,3表示 1 行到 3 行。也可以使用正则表达式来匹配。
- 动作。替换,删除等等。当动作为替换的时候,可以使用
s/正则表达式/替换内容/[g]
的形式。使用替换也可以完成删除的功能。如果想要全局匹配,而不是 每一行只匹配第一个符合的,那么最后加上g字母。
如果想要使用扩展的正则表达式,那么可以加上-E选项。
-e的作用是后面跟command,因此,一个sed里面可以有多个command
具体可以看 http://c.biancheng.net/linux/sed.html
4 重定向的问题
重定向不可以重定向到前一个命令的源文件中去。这样会导致前一个命令的源文件变成空的。如果有这个需求,可以配合使用tee命令。tee用于从标准输入中读取数据,写入文件中。使用如
sed -n '/img.*src=/ p' url.2 | tee url.2 > /dev/null
的命令可以更新url.2,并且 >/dev/null 可以不把数据输出到屏幕上。
5 字符串的拼接
如果要重新拼接一个变量,如果要拼接的内容在原始变量的前面,那么使用变量=内容$变量
即可完成拼接。如果在原始变量后面,那么使用变量=$变量内容
可能引发错误。因为变量的边界不明确。可以使用变量=${变量}内容
。
如果想要拼接一个命令的输出,那么直接街上反括号括起来command
即可完成内容的嵌入。
6 预置参数的问题
$1,$2等表示参数值,如果没有对应的参数传进去的话,其也不为空。至于其是什么,我现在还不知道。不要使用[ -n $1 ]来进行判断。因为其总是为真
7 不要忘记程序结构后面的”小尾巴“,就是比如fi, done等。否则会造成文件结束异常的问题