shell命令 — 字符串相关

type -a 命令可以查看某个shell命令的含义,对alias也适用

echo带颜色的文本

需要使用参数-e,格式为echo -e "\033[字背景颜色;文字颜色m字符串\033[0m",比如"\033[45;5m 闪烁效果 \033[0m"

1
2
3
4
5
6
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"

\033[5m 闪烁效果,这个以前不知道

1
2
3
4
5
6
7
8
9
字背景颜色范围: 40--49                   字颜色: 30--39 
40: 黑 30: 黑
41:红 31: 红
42:绿 32: 绿
43:黄 33: 黄
44:蓝 34: 蓝
45:紫 35: 紫
46:深绿 36: 深绿
47:白色 37: 白色

对shell脚本进行语法检查

1
bash -n script_name.sh         //   -n选项只做语法检查,而不执行脚本。

例如,检查结果可能是这样:

1
2
3
# bash -n t.sh 
t.sh: line 6: syntax error in conditional expression: unexpected token `;'
t.sh: line 6: syntax error near `;'

连续执行命令

连续执行shell命令有三种情况:

  • 用分号;间隔,会一直执行,无论命令对错。 echo abc; echo 123
  • &&间隔,执行到错误命令会停止。echo abc && adf && echo 123
  • ||间隔,执行到正确命令会停止。

二元比较操作符,比较变量或者比较数字.

整数比较

1
2
3
4
5
6
-eq 等于        if [ "$a" -eq "$b" ] 
-ne 不等于 if [ "$a" -ne "$b" ]
-gt 大于 if [ "$a" -gt "$b" ]
-ge 大于等于 if [ "$a" -ge "$b" ]
-lt 小于 if [ "$a" -lt "$b" ]
-le 小于等于 if [ "$a" -le "$b" ]

比如 $a -eq 10

字符串比较

1
2
= 等于        if [ "$a" = "$b" ] 
== 等于 if [ "$a" == "$b" ],与=等价


参考: shell脚本 if语句

字符串条件判断

1
2
3
4
if [ "$net" = "0" ]
then
echo "local"
fi

注意:

  • 左右方括号都要留空位,if后面也要有空位
  • Shell下使用等号赋值时,左右两边不能有空位
  • 一个等号和两个等号都可以
  • then要另起一行,以if开头,以fi结尾

查找字符串

grep -r "struct event_base" -n
在当前目录查找字符串,找到后返回文件和对应的行

空格的有和没有

定义变量时, =号的两边不可以留空格

1
gender=femal

条件测试语句 [ 符号的两边都要留空格
1
if [ $gender = femal ]; then

条件测试的内容,如果是字符串比较的话, 比较符号两边要留空格

1
if [ $gender = femal ]; then

如果if 和 then写在同一行, 那么,注意, then的前面要跟上 ; 号.如果 then 换行写, 那么也没问题.

1
2
if [ $gender = femal ]
then

命令和其后的参数或对象之间一定要有空格

1
if [ -x"~/Workspace/shell/a.sh" ];then

取字符串的某一段

1
2
3
4
5
6
7
#/bin/bash -e

ip="192.168.0.123"
net=$(cut -d'.' -f3<<<"192.162.0.123") # 3个<
sub=$(echo $ip | cut -c1-7) # -c 一般用于文件,比如 cut -c1-4 test.txt
echo $net
echo $sub

结果是:

1
2
0
192.168

cut命令一般用于处理表内容,例如只取某一列
-c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为”TAB”;
-f:显示指定字段的内容;

使用awk的内建函数:

1
2
3
hostname -I | awk '{split($0,a,".");print a[1],a[2],a[3],a[4]}'   # 192 168 0 123

hostname -I | awk '{print substr($0,0,4)}' # 192.

所以如果想获得ip的网段,可以使用net=$(hostname -I | awk '{split($0,a,".");print a[3]}')

列出当前目录下,最大的10个文件

ls -Slh | head

连接字符串

如果想要在变量后面添加字符,可以用以下方法:

1
2
3
4
5
$value1=home

$value2=${value1}"="  # 用单引号也行

echo $value2

把要添加的字符串变量添加{},并且需要把$放到外面。这样输出的结果是home=,连接成功。

echo

echo换行

echo要支持同C语言一样的\转义功能,只需要加上参数-e

echo -e “\n” 就是换行
echo -e $(cat test.txt)
其中test.txt的内容:

1
aaa \nbbb

结果就是:
1
2
aaa
bbb

不要加双引号,那样会保留下来

echo文本到文件

echo换行的文本

1
2
3
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world

echo $(cat 1.txt) > 2.txt可以把文件1的内容复制到文件2。但如果文件1每行结尾没有加\n,文件2的内容不会换行。另外这样会覆盖文件2原有的内容。如果不想覆盖,而是追加到文件2,只要把>改为>>即可