基本shell脚本
1 #!/bin/bash 2 attr=() 3 num=0 4 while true 5 do 6 read -p ">>input:" name 7 attr[$num]=$name 8 echo ${attr[$num]} 9 let num++ 10 if [ $num -eq 3 ]; then 11 echo ${attr[*]} 12 exit 13 fi 14 done
循环输入后打印输入的值 效果图:
eg:
循环输出:
*和@符号的区别:
-a : 逻辑与 两个都为真
-o : 逻辑或 一个为真即为真 其中很多例子 此结果为false
shell语句实例: 通过随机数猜数字大小游戏:
1 #!/bin/bash 2 3 prive=$(expr $RANDOM % 1000) 4 echo $prive 5 count=1 6 while true 7 do 8 read -p "请输入一个1-1000的随机数:" num 9 if [ $num -gt $prive ]; then 10 echo "大了" 11 elif [ $num -lt $prive ]; then 12 echo "小了" 13 else 14 echo "两个数相等" 15 echo $count 16 exit 0 17 fi 18 let count++ 19 done
shell语句注意事项:
1. 变量名和等号之间不能有空格
2. 不能使用标点符号
3. 不能使用bash里的关键字
只读变量: name="security"
关键字: readonly name
删除变量:unset name
变量类型:1. 局部变量:在脚本或命令行中定义,尽在当前shell实例中有效,其他shell启动的程序不能访问其局部变量
2. 环境变量: 所有程序都可以启动程序,都可以访问环境变量
查看所有环境变量:env
删除环境变量:unset NAME
用vim在/etc/profile文件中添加我们想要的环境变量
设置新的环境变量
export 新环境变量名=内容
例:export MYNAME=”LLZZ” 生效: source /etc/profile
shell 字符串:
单引号和双引号的区别
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
双引号的优点:
-
- 双引号里可以有变量
- 双引号里可以出现转义字符
获取字符串的长度:str="abcd"
echo ${#str}
提取字符串:str=”abcd”
表示从字符串第二个字符开始截取 ,取 4个字符
echo ${str:1:4}
shell 数组
定义数组
arr=(aa bb cc)
读取数组
echo ${arr[0]}
获取数组的长度
echo ${arr[@]}
echo ${arr[*]}
shell 多行注释:
:<<EOF
xxxx
xxxxx
EOF
shell 基本运算符 +-*/% = == != 加减乘除 取余 赋值 比较(相等) 不相等
1 [root@localhost ~]# expr 10 + 20 2 30 3 [root@localhost ~]# echo $((10+30)) 4 40 5 [root@localhost ~]# n=10 6 [root@localhost ~]# let n++ 7 [root@localhost ~]# echo $n 8 11 9 []和[[]]区别 10 [[]]更强大,支持字符串的模式匹配(使用=~操作符时甚至支持shell的正则表达式) 11 [root@localhost ~]# sh t.sh 12 包含 13 [root@localhost ~]# cat t.sh 14 #!/bin/bash 15 a="xxoo" 16 if [[ $a =~ "x" ]]; then 17 echo "包含" 18 else 19 echo "不包含" 20 fi
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
-eq 是否相等
-ne 是否不相等
-gt 表示大于
-lt 表示小于
-ge 大于等于
-le 小于等于
linux shell中"2>&1"含义
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1 */2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1
对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
对于2 ,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null
可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.
偶尔也可以把 & 在命令的最后加上,表示让程序后台执行。
为何2>&1要写在后面?
index.php task testOne >/dev/null 2>&1
我们可以理解为,左边是标准输出,好,现在标准输出直接输入到 /dev/null 中,而2>&1是将标准错误重定向到标准输出,所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。
可以理解为,如果写在中间,那会把隔断标准输出指定输出的文件
你可以用
ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。
批量在配置文件中修改删除
:g/^#/d #全局 以#开头 删除 全局删除注释
: g/^$/d #全局 开头即结尾 删除所有空行