1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 |
# 标准开头 通常是bash #!/bin/bash # 此处可写脚本功能注释 # 定义变量 =两边不要加空格 变量名不能以数字开头 变量值如果有空格需要用引号包裹或用\转义 LOG_DIR=/var/log name = BestLove //错误,不能空格 name=Best Love //错误,不能空格 1name=BestLove //错误,不能数字开头 name=BestLove //正确 //name=BestLove's name //错误,引号必须成对出现 name="BestLove's name" //正确 name=BestLove\'s\ name //正确,转义了'和空格 name=$namehaha //错误,不是拼接haha了 name="$name"haha //正确 name=${name}haha //正确 name=BestLove //定义变量名 bash //进入子程序 echo $name //输出为空,子程序外定义的变量在子程序中无法获取 exit //退出子程序 export name //将变量设为环境变量 bash //进入子程序 echo $name //输出了BestLove exit //退出子程序 unset name //释放变量 //使用反引号或$()可以实现指令嵌套 uname -r会被执行,获取核心版本号 cd /lib/modules/`uname -r`/kernel cd /lib/modules/$(uname -r)/kernel //使用env或export能查看环境变量 HOME //用户目录和~差不多 SHELL //当前环境使用的是哪个shell,默认一般是/bin/bash PATH //执行文件的搜索路径 LANG //编码格式 RANDOM //随机数0-32767 //locale查看linux支持的编码格式 //定义数字类型number为0-9 declare [-aixr] variable -a:array -i:int -x:export -r:readonly // declare -p 变量名 可以查看变量的类型 declare +x 变量名 可以取消-的操作 declare -i number=$RANDOM*10/32768; echo $number //数组也可以用中括号来定义 test[1]=aaa test[2]=bbb echo "${test[1]},${test[2]}" //$本身也是个变量,表示本shell的PID echo $$ //?关于上个指令的回传值 0表示成功 非0一般是错误码 echo $? //获取键盘输入,赋值给变量 read [-pt] variable -p后面可以接提示字符 -t后面接等待秒数 read -p "请输入yes or no,10秒后不输入默认为yes:" -t 10 flag echo $flag //ulimit [-SHacdfltun] [配额] 重启需要重写设定 //-H hard limit 严格的设定,必定不能超过这个值 //-S soft limit 警告的设定,如果超过这个值会有警告。通常soft比hard小一点 比如sort设80,hard设100 //-a 后面不接任何选项与参数,可列出所有的限制额度 //-c 当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案,这种档案就被称为核心档案(core)。此为限制每个核心档案的最大容量 //-f 此shell可以建立的最大档案容量(一般可能设定为2GB)单位为Kbytes //-d 程序可使用的最大断裂内存容量 //-l 可用于锁定(lock)的内存量 //-t 可使用的最大cpu时间(单位为秒) //-u 单一用户可以使用的最大程序数量 //-n 最大允许连接数 # echo $a会删除ls结果中多余的tab和换行 echo "$a"会保留ls结果中的tab和换行 a=`ls -al` echo $a echo "$a" # a+=1会输出字符串拼接 let a+=1会相加 a=1 a+=1 let a+=1 echo $a # 将1122替换成55 a=11223344 b=${a/1122/55} echo $b # 使用变量 $变量名 cd $LOG_DIR # 清空/var/log/message cat /dev/null > message # 输出执行脚本的信息 echo "ok" # 标准退出 exit ROOT_UID=0 # $UID=0时,用户才有root权限 E_NOTROOT=67 # 非root用户将以error退出 # 如果用户不是系统用户 输出信息 退出 if [ "$UID" -ne "$ROOT_UID" ] then echo "mush be root" exit $E_NOTROOT fi # 如果不换行 需要使用; if [ xxx ]; then # case选项需要双分号;; case "$variable" in abc) echo "\$variable = abc" ;; xyz) echo "\$variable = xyz" ;; esac # 逗号链接了一系列的算术操作,虽然里面的所有内容都被运行,但只有最后一项被返回 1 let "t2 = ((a = 9, 15 / 3))" # Set "a = 9" and "t2 = 15 / 3" # :内建命令(一个什么也不干的命令) 也可以被认为与shell的内建命令true作用相同 while : do ... done while true do ... done if xxx then : #什么也不做,引出分支 elif xxx then ... else ... fi # :> 可以把文件清空 如果文件不存在,创建这个文件 # 与 cat /dev/null > test.log 作用相同 但它不会产生一个新的进程 因为:是内建命令 :> test.log # : 还能作为占位符和分隔符 : ${username=`whoareyou`} /usr/local/bin:/bin:/usr/bin # !取反 # *通配符 算术操作符(乘) **求幂运算 # ?双括号中作为三元操作符 参数替换中测试变量是否被set 正则中通配一个字符 # $引用变量 正则结束符 ${}参数替换 $* $@位置参数 $?退出状态码变量,保存一个命令、一个函数或者脚本本身的退出状态码 # $$进程ID变量,保存它所在脚本的进程ID # $1第一个参数 $2第2个参数 ... $0获取脚本名称 # ()命令组(a=hello;echo $a),在括号中的命令作为一个子shell来运行,括号中的变量是局部变量,只能在括号(子进程)中使用 # array=(a b c)初始化数组 echo ${array[1]}会输出b # 把file1 file2 file3连接到一起,并重定向到combined_file中 cat {file1,file2,file3} > combined_file # 拷贝file.txt到file.bak {}中不允许有空白,除非被\ '' "" 转义或引用 cp file.{txt,bak} # {}中的变量在外部是可以用的 #!/bin/bash # 读取test.php中的行 FILE=/home/wwwroot/default/test.php { read line1 read line2 } < $FILE echo $line1 echo $line2 exit 0 # > &> >& >> < <> >| 重定向 >覆盖 >>追加 &>重定向stdout和stderr >&2重定向stdout到stderr >|强制重定向 # shift命令 逐步获取所有的位置参数 $1 $2 $3 ... #!/bin/bash # until循环和while相反 while是false出循环 until是true出循环 until [ -z "$1" ] #直到所有的位置参数都被存取完 do echo -n "$1 " #-n表示不要在最后自动换行 shift done echo #输出额外的换行 exit 0 //#从变量最左边往右删除,是懒惰匹配的,可以使用*通配符 %是最右边往左边删除 ##和%%是贪婪匹配 输出cccdddbbboooooooooooooo test=aaabbbcccdddbbboooooooooooooo test=${test#*bbb} echo $test //同样以test变量为例,/表示懒惰替换 //表示贪婪替换 输出aaaBBBcccdddbbboooooooooooooo test=aaabbbcccdddbbboooooooooooooo test=${test/bbb/BBB} echo $test // - :- + :+ = := ? :? 变量设定方式 str没有设定 str为空字符串 str已设定为非空字符串 var=${str-expr} var=expr var= var=$str var=${str:-expr} var=expr var=expr var=$str var=${str+expr} var= var=expr var=expr var=${str:+expr} var= var= var=expr var=${str=expr} str=expr str不变 str不变 var=expr var= var=$str var=${str:=expr} str=expr str=expr str不变 var=expr var=expr var=$str var=${str?expr} expr输出至stderr var= var=$str var=${str:?expr} expr输出至stderr expr输出至stderr var=$str // type -a command 可以了解命令的搜索顺序 通常顺序为 /bin/ls或./ls -> 通过alias找 -> 由bash内建的指令执行 -> 通过$PATH找 type -a ls // 重启保留的bash需要写入配置文件 login shell和non-login shell的配置文件不同 // login shell //整体的配置,最好不要改 /etc/profile还会读很多其他配置 /etc/profile //属于使用者个人设定 只会读取以下三个中的一个,顺序是从上往下 个人设定会累加整体配置 ~/.bash_profile ~/.bash_login ~/.profile // source或.命令会使写入配置文件的内容立即生效(不重启) ~/.bashrc是non-login shell会读的配置文件 source ~/.bashrc . ~/.bashrc // stty -a 查看所有的快捷键 ^表示ctrl 例如:默认intr = ^C stty intr ^X 就可以设置成ctrl+x中断了 // 显示目前所有的set设定值 echo $- // set [-uvCHhmBx] 例如:set -u echo $undefined会显示错误信息 set +u可以取消设定 // -u :预设不启用。若启用后,当使用未设定变量时,会显示错误信息; // -v :预设不启用。若启用后,在信息被输出前,会先显示信息的原始内容; // -x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号) // -h :预设启用。与历史命令有关; // -H :预设启用。与历史命令有关; // -m :预设启用。与工作管理有关; // -B :预设启用。与刮号[]的作用有关; // -C :预设不启用。若使用>等,则若档案存在时,该档案不会被覆盖。 //标准输入(stdin):代码为0,使用<或<< //标准输出(stdout):代码为1,使用>或>> //标准错误输出(stderr):代码为2,使用2>或2>> //执行test.php /dev/null类似windows回收站 第一个>表示把正确输出丢弃到回收站 2>&1或&>表示把错误输出指向正确输出一起丢弃 php test.php > /dev/null 2>&1 //把2.log的内容追加到1.log cat >> 1.log < 2.log // << 类似于php中的界定符 // cat >> 1.log << 2.log // > 此时不会把2.log的内容写进1.log // > 我可以一直写 // > 直到再次碰到2.log才会中止 // > 2.log // 一次执行多个指令 ; && || | sync;sync;shutdown -h now // 如果第一个命令执行成功 $?=0 则执行第2个命令 反之不执行 php a.php && php b.php // 如果第一个命令执行不成功 $?!=0 则执行第2个命令 反之不执行 php a.php || php b.php // 与;不同 |后的命令能读取上一个命令的stdout 而且|后的命令必须是能接收stdin的命令才行 ls /etc | less // |后面一般可以跟过滤命令 // echo $PATH输出/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games: // -d后面接分隔符 -f后面跟第几段(可用,隔开,隔开后会保留中间一个分隔符) -c从第几个字符起截取 echo $PATH | cut -d ':' -f 3,5 sbin // /sbin:/usr/local/bin echo $PATH | cut -c 6- // /usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games: // grep -a将binary档案以text档案的方式搜索 -c计算找到搜索字符串的次数 -i忽略大小写 -n顺便输出行号 -v反向选择(没有找到搜索字符串的行) last | grep 'root' // 找出root登录的行 last | cut -d ' ' -f 1 | sort | uniq -c //当月登录用户按首字母排序并统计登录次数 // 当然grep可以不跟在|后面使用 grep 'echo' index.php // wc 统计文件 -l行数 -w单词说(按空格统计) -m字符数 默认-lwm wc index.php last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l // tee双向重导向(既重定向到文本又输出到屏幕) -a追加(append) php test.php | tee -a test.log // split将文件分割成多个 -b按大小分割单位b k m -l按行数分割 split -b 300k ./test.php test // 可以将split分割的文件合并成一个 cat test* >> haha.php // xargs生成指令参数 -0如何stdin含有特殊字符,\空格等 可以将它们还原成一般字符 -e EOF 后面跟一个字符串 当xargs分析到这个字符串就停止工作 // -p 执行每个指令的argument时,都会询问使用者的意思 -n后面接次数 每次command执行时要使用几个参数的意思 |