基本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

-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    #全局  开头即结尾  删除所有空行

 

posted @ 2019-11-29 15:22  Security  阅读(503)  评论(0编辑  收藏  举报
小布的个人空间 京ICP备2023021324号-1