否则打开vim编辑器。
5. id tom &>/dev/null && echo "Hi tom" || echo "No such user"如果id tom 执行成功,则说明用户存在,屏幕将显示Hi,tom 否则显示No such..3.3.3作业控制技巧:# vim & # jobs # fg 1 通过fg<编号>的形式将进程再次调回到前台执行;3.3.4 花括号{}的使用技巧:# echo {a,b,c} 通过花括号扩展可以生成命令行或脚本所需要的字串# echo user{1,5,8} # user1 user5 user8 # echo {0..10} #1 2 ..10# echo {0..10 ..2} # 0 2 4..10# echo a{2..-1} #a2 a1 ..a-1# mkdir /tmp/dir{1..5}#ls -ld /tmp/dir{1,2,3}#chmod 777 /tmp/dir{1,2}#kill -9 {4603,8345,11574,12257}3.4变量3.4.1自定义变量:建议统一使用大写或者首字母大写。
默认NAME的值是可以被修改的,但可以通过typeset 为这个变量添加只读属性来防止误操作,如果需要限定变量值可以设置为整数,亦可以用typeset添加属性;NAME=tomcatecho $NAMEtypeset -r NAME #添加readonly只读属性declare INT_NUMBER #预先定义一个变量,但是暂时不给赋值typeset -in INT_NUMBER #设置整数变量read P_NUMBER #回车后输入要赋值给P_NUMBER的值echo $P_NUMBERread -p "Please input a number:"P_NUMBER # set #查看当前系统中设置的所有的变量和值unset P_NUMBER #删除变量;3.4.2 变量的使用范围使用name=[value]的形式定义的变量默认仅在当前shell 中有效,子进程不会集成这样的变量.使用export 命令会将变量放入环境中,这样的进程会从父进程哪里继承环境,export 可以直接定义环境变量并赋值.TEST=passecho $TESTbash #在当前shell下开启新进程bashecho $TEST #查看变量值为空exitexport TEST #将已有用户变量添加至环境export NAME=tom # 直接定义环境变量3.4.3 环境变量Bash预设定了很多环境变量,可以直接调用这些变量;Bash手册:BASHPID 当前bash进程的进程号GROUPS 当前用户所属的组ID号HOSTNAME 当前主机的主机名称PWD 当前工作目录OLDPWD 前一个工作目录RANDOM 0 - 32767之间的随机数UID 当前用户的ID号码HISTSIZE 命令历史的记录条数HOME 当前用户的家目录PATH 命令搜索路径PS1 主命令提示符PS2 次命令提示符echo $PATH/usr/local/sbin:/usr/....#PATH=/root给PATH直接赋值/root目录, 则以后再执行ls命令会提示没有找到. 因为系统只会在/root目录下查找有没有ls命令. 但是因为修改并没有通过写入文件的方式吧修改永久保存至环境变量, 所以退出重新登录即可复原.修改PATH变量的正确方法是在原来的基础上修改,所以在赋值时需要引用旧值:#PATH=$PATH:/root #在与原有路径列表后追加目录3.4.4 位置变量test.sh#!/bin/bash#This is test script for parameter!echo "This is file name:$0"echo "This is first parameter:$1"echo "This is second parameter:$2"echo "This is the number of all parameter:$#" echo "This is the all parameter:$@"echo "This is PID:$$"#bash /tmp/test.sh a b c #允许改脚本使用3个参数注释:$0代表当前Shell程序的文件名称, $1代表允许shell 程序是的第一个参数,范围$1~$9;使用Shell位置变量有助于我们查看很多相关信息, $#代表Shell程序所以参数个数; $*和$@均代表所有参数的内容,区别是$*将所有的参数作为一个整体,而#@将所有的从参数分别作为个体看待.$$ 代表当前进程的ID号码,$? 表示程序的退出代码(一般0代表命令成功执行,非0代表命令执行失败)3.4.5Linux中一般可以使用${变量名}的形式展开变量的值 # echo ${NAME}${varname:-word} 如varname存在且非null,则返回其值,否则返回word${varname:=word} 如varname存在且非null,则返回其值,否则设置为word${varname?message} 如varname存在且非null,则返回其值,否则显示varname:message${varname:+word} 如varname存在且非null,则返回word,返回null修改变量的值输出${variable#key} 从头开始删除关键字,执行最短匹配${variable##key} 从头开始删除关键字,执行最长匹配${variable%key} 从尾开始删除关键字,执行最短匹配${variable%%key} 从尾开始删除关键字,执行最长匹配${variable/old/new} 将old替换为new,尽替换第一个出现的old${variable//old/new}将old替换为new,替换所有的old # USR=$(head -1 /etc/passwd)# echo ${USR%:*:}3.4.6 数组# B=(aa bbb cccc)# echo ${B[0]}:${B[1]}:${B[2]}# echo ${A[*]} #${name[*或@]}调用所有的数组成员.# echo ${A[@]}# echo "length of B_2 is ${#B[2]}"#${#name[subscript]}可以返回长度3.4.7 算术运算与测试# $((expression)) 算术表达式# expr arg1 + arg2 命令工具expr也可以实现算术运算使用Bash内置命令 test 可实现测试工作或者使用 [ 测试表达式 ].注意使用[ 表达式 ]记得在表达式两边都要留有空格# test -d /etc/ && echo "yes" || echo "no" # etc是目录就yes,否则no# [ -d /etc/ ] && echo "yes" || echo "no"-d file 文件文件是否存在且为目录是否存在且为目录-e file 文件是否存在文件是否存在-f file 文件是否存在,且为普通文件文件是否存在-r file 文件是否存在且可读-w file 文件是否存在且可写-x file 可执行-s 非空-h 是否为空链接-n STRING 字符串长度非0-z STRING 字符串长度为0STRING1 = STRING2 字符串相等!= 不相等INTER1 -eq INSTER2 整数1与整数2相等-ge 大于或等于-gt 大于-le 小于或等于-lt 小于-ne 不等于# [ -n $PATH ] && echo "yes" || echo "no"#PATH变量有定义,所以为非空3.5 shell引号3.5.1 反斜线\* 把 * 作为字母意义上的普通字符在命令的末尾使用 \回车后, \可以将回车的命令功能屏蔽,换行继续输入命令# echo * # 显示当前目录的所有文件列表# echo \* # 显示*字符# find / \> -name "test.txt" \> -type f \> -size +5M3.5.2 单引号单引号可以将它中间的所有任意字符还原为字面意义,实现屏蔽shell元字符的功能. 单引号必须成对出现.3.5.2 双引号类似于单引号 , 但其不会屏蔽 ' , \ 和 $ 这三个shell元字符的含义.如果需要屏蔽这些字符含义,必须前置一个 \ 符号,# echo "\$HOME"3.5.4 反引号Shell中使用反引号进行命令替换 , 是shell可以将命令字符替换为命令执行结果,$()同样结果# echo "Today is `date +%D`"# echo "Today is $(date +%D)"3.5 正则表达式Everything is file# cp /etc/passwd /tmp/# grep root /tmp/passwd #查找包含root的行查找:与0:之间包含任意两个字符的字串, 并显示该行(--color代表以颜色加亮显示匹配的内容)# grep --color :..0: /tmp/passwd查找包含至少一个0的行(第一个0必须出现,第二个0可以出现)# grep --color 00* /tmp/passwd查找包含oot或ost的行grep --color o[os]t /tmp/passwd查找包含数字0~9的行grep --color [0-9] /tmp/passwd查找包含字母f-q的行grep --color [f-q] /tmp/passwd查找以root开头的行:grep --color ^root /tmp/passwd查找以bash结尾的行grep --color bash$ /tmp/passwd查找sbin/后边不跟n的行:grep --color sbin/[^n] /tmp/passwd查找数字0出现1次, 2次的行:grep --color '0\{1,2\}' /tmp/passwd查找包含两个root的行(注:grep 在使用/(/)过滤时, 匹配条件必须使用引号);grep --color "\(root\) .*\1" /tmp/passwd查找包含以root: 开头并以 :root 结尾的字串行:grep --color "\(root\)\(:\).*\2\1" /tmp/passwd过滤文件的空白行:grep ^$ /tmp/passwd过滤文件的非空白行:grep -v ^$ /tmp/passwd3.6 Awk 操作指令1.记录与字段<1>读取输入行并输出第一个字段,第二个字段,第三个字段. echo hello the world | awk '{print $1,$2,$3}'<2>读取输入行并输出该行echo hello the world | awk '{print $0}'<3>读取输入行并输入该行的字段个数echo hello the world | awk '{print NF}'<4>读取输入行并输出该行最后一个字段echo hello the world | awk '{print $NF}'2.字段分隔符默认awk读取数据以空格或者制表符作为分隔符,但可以通过-F 或FS(field separator)变量来改变分隔符.将字段的分隔符改为冒号(:),awk -F: '{print $1}' /etc/passwdawk 'BEGIN {FS = ":"} {print $1}' /etc/passwd指定多个字段分隔符echo 'hello the:word , !'|awk 'BEGIN {FS=[:, ]"} {print $1,$2,$3,$4}'自动化运维的必要条件:1.可扩展的高并发网站集群架构F5 , A10DNS->LB4->LB7->Cache->Web->中间件->DB->存储。