windows和linux编写bash脚本的时候遇见条件,循环,语句遗忘时,都可以通过help for查询。
linux系统shell脚本bash语法
#!/bin/bash country="China" directory=`pwd` unset directory directory=$(pwd) a=10 b=20 expr $a + $b eval command-line string="abcd" echo ${#string} #length echo ${string:1:2} #bc basename /home/yin/1.txt #1.txt dirname /home/yin/1.txt #/home printf "%s and %d \n" #and 0 printf '%d %s\n' 1 "abc" printf "%s %s %s\n" a b c d e f g h i j if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi; if [ $ab == $cd ]; then echo "ab equal cd"; else echo "ab unequal cd"; fi if [ "a" == "a" ]; then echo 'str are equal'; else echo 'str not equal' ; fi; if [ 12 -eq 345 ]; then echo 'num are equal'; else echo 'num not equal' ; fi; # num: -eq -ne -gt -lt -ge -le # str: == != > < -z string -n string # -a:and -o:or !:not # file: -e file -f file -d file -r file -w file -x file for loop in 1 2 3 4 5 do echo "The value is: $loop" done for FILE in $HOME/.bash* do echo $FILE done for(( i = 1; i <= 100; i = i + 2 )) do let "sum += i"; done while [ $COUNTER -lt 5 ]; do COUNTER=$(expr $COUNTER + 1); done while((i<=5)); do echo $i let i++; done a=10; function func() { local a=2; }; func; echo $a # 10 until [[ "$i" -gt 5 ]]; do let "i++"; break; done select color in "red" "blue" "green" "white" "black"; do break; done case value in parten1) command1 ;; *) command1 ;; esac function function_name () { list of commands [ return value ] } unset .f function_name 0,数组 #bash only support one v array start with zero array_name=(value0 value1 value2 value3) array_name[0]=value0 array_name[1]=value1 array_name[2]=value2 ${array_name[index]} values=${array_name[*]} values=${array_name[@]} length=${#array_name[@]} length=${#array_name[*]} set -- one two three # setting $1 $2 $3 eval echo \${$n} # cmd command1 && command1 || command3 & > 2>&1 1,路径 # shell long path declare -x PS1 \w # shell short path declare -x PS1 \W 2,条件 if [ -d "/data/test" ];then echo "file exist" else echo "file none" fi -e filename 如果 filename存在,则为真 [ -e /var/log/syslog ] -d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ] -f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ] -L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ] -r filename 如果 filename可读,则为真 [ -r /var/log/syslog ] -w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ] -x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ] filename1-nt filename2 如果 filename1比 filename2新,则为真 filename1-ot filename2 如果 filename1比 filename2旧,则为真 3,截取 从左向右截取最后一个string后的字符串${varible##*string} 从左向右截取第一个string后的字符串${varible#*string} 从右向左截取最后一个string后的字符串${varible%%string*} 从右向左截取第一个string后的字符串${varible%string*} #“*”只是一个通配符可以不要 ${#string}$string的长度 ${string:position}在$string中, 从位置$position开始提取子串 ${string:position:length}在$string中, 从位置$position开始提取长度为$length的子串 ${string#substring}从变量$string的开头, 删除最短匹配$substring的子串 ${string##substring}从变量$string的开头, 删除最长匹配$substring的子串 ${string%substring}从变量$string的结尾, 删除最短匹配$substring的子串 ${string%%substring}从变量$string的结尾, 删除最长匹配$substring的子串 ${string/substring/replacement}使用$replacement, 来代替第一个匹配的$substring ${string//substring/replacement}使用$replacement, 代替所有匹配的$substring ${string/#substring/replacement}如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring ${string/%substring/replacement}如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring 4,括号 linux bash [和[[ [是bash内置关键字语法命令,[[是shell的命令 单小括号()命令替换执行$(cmd) 初始化数组。如:array=(a b c d) 双小括号(( )) 表达式C运算用于求表达式的值,a=5; ((a++)) 可将 $a 置为6 //echo $((16#5f)) //即95 单中括号[]①bash 的内部命令,[和test等同,②字符串==和!=,整数-eq,-gt,不能使用>,<可转义用于字符串 单中括号[]中的逻辑与和逻辑或使用-a 和-o ,[ ab \< bc ],结果为真, 双中括号[[ ]] ①[[是 bash 程序语言的关键字,而非命令 支持逻辑运算和模式匹配 注意:使用[]和[[]]不要吝啬空格,每一项两边都要有空格,[[ 1 == 2 ]]//false,但[[ 1==2 ]] //true 5,引号 # 由单引号括起来的字符都作为普通字符出现 # 由双引号括起来的字符,除$\’”作为特殊功能并保留,其余字符仍作为普通字符对待 # 由反引号括起来的字符串被shell解释为命令行,推荐使用$()新的用法替代反引号 6,井号 # $? 上一个命令或者脚本的退出码 # $$ 上一个命令或者脚本的进程PID # $# 传递给脚本或函数的参数个数 # $0 当前脚本的文件名 # $n 传递给脚本或函数的第n个参数 # $* 传递给脚本或函数的所有参数,退化引号空格分割 as.sh a "b c" # $* arg1=1 arg2=2 arg3=3 # $@ 传递给脚本或函数的所有参数,保留引号原始分割 as.sh a "b c" # $@ arg1=a arg2=b c 7,流程 # set -u 执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它 # set -x 默认情况下,脚本执行后,屏幕只显示运行结果,没有其他内容 # set -e 它使得脚本只要发生错误,就终止执行 # set -e 针对管道|会把最后一个管道返回值作为整个命令的返回时 # set -o pipefail 只要一个子命令失败,整个管道命令就失败,脚本就会终止执行 # command || exit 1 如果某个命令失败,往往需要脚本停止执行,防止错误累积 # command || true 如果某个命令返回非零并不代表失败,需要脚本继续执行,或者写作: # set +e # command1 # set -e # submit: bash -euxo pipefail as.sh | set -euxo pipefail | set -eux ; set -o pipefail
0,sed command 常用操作
一,搜索 sed -n "/^\set.*/p" Des ktop/vimrc 二,删除 sed "/^\".*/d" Desktop/vimrc sed "/^\set.*/d" Desktop/vimrc sed -i "/^$/d" ~/.vimrc #删除文件中的空行 sed -i "/^\s*$/d" ~/.vimrc #删除文件中的空格行 三,替换 sed -i "s/^[ \t]*//" ~/.vimrc #搜索替换文件中行首的空格 sed -i "s/[ \t]*$//g" ~/.vimrc #搜索替换文件中行末空格 sed -i "s/[[:space:]]//g" ~/.vimrc #搜索替换文件中所有的空格 sed -i "s/[ \t]/,/g" ~/.vimrc #把文件中空格变为‘,’ 四,备注 mac下 sed -i 直接操作被禁止,出于安全策略提供备份文件机制 发现 -i 需要带一个字符串,用来备份源文件,这个字符串加在源文件名后面组成备份文件名 如果这个字符串长度为0,就是说是个空串则不备份。例如: sed -i "" ’s/old/new/g’ Desktop/vimrc
1,grep awk command 常用操作
一,grep grep -n est.txt 打印行号 grep -v est.txt 反向过滤 grep -e "\s*" est.txt 正则匹配 grep test ~/ 搜索目录包含 grep -r test ~/ 搜索目录不包含 grep -v '^\s*$' test.txt 二,awk awk NF test.txt awk '/./ {print}' file 或 awk '{if($0!=" ") print}'
2,unix获取当前shell脚本的所在路径
basedir=`cd \`dirname $0\`; pwd` basepath=$(cd `dirname $0`; pwd)
3,linux mint 64位出现fatal error: stdio.h: 没有那个文件或目录
在32环境下一般不会出现这个问题,因为已经把libc的头文件包括在系统中了 build-essential package - Installs the following collection to compile c/c++ program on Debian/Ubuntu Linux: sudo apt-get install build-essential 包含如下组件: libc6-dev - C standard library. gcc - C compiler. g++ - C++ compiler. make - GNU make utility to maintain groups of programs. dpkg-dev - Debian package development tools. 也可单独安装,即可满足使用: sudo apt-get install libc6-dev
4,apache2和vsftpd配置
apache2 配置网站主页文件:/etc/apache2/mods-enabled/dir.conf 配置网站主页路径:/etc/apache2/sites-enabled/000-default.conf vsftpd vsftpd安装完毕之后不用任何配置即可用(debian 9至少是这样) 安装:apt-get install vsftpd 启动root登陆:vim /etc/ftpusers注释掉root即可。 nginx vim /etc/nginx/sites-enabled/default 修改端口 vim /etc/nginx/sites-enabled/default 修改目录 vim /usr/share/nginx/html/index.html 修改首页 sudo netstat -anp | grep nginx 查看端口
5,查看防火墙状态防火墙未启动则不限制端口。
ufw status ufw allow 80 ufw enable ufw reload
6,查看端口占用
netstat -anp | grep 8080
7,查看进程
ps -ef ps -ef | grep ftpServer pkill ftpServer kill -9 2345
8,Win下面编辑过shell脚本换行符变为\n\r,导致linux 执行脚本出错
bash: ./and.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录 bash: ./and.sh: /bin/bash^M: 解释器错误: 没有那个文件或目录 sed -i "s/\r$//" and.sh
9,显示换行符和行号
cat -A codefile grep -n make and@and-ThinkPad-T440s ~/as/and_h264_decode_encode $ ll -rwxrwxr-x 1 and and 13864 8月 5 01:40 decoder.out* 第1列:第一个单词(文件类型【-为普通文件】【d为文件夹】)后面9位权限(rwx(当前用户)rwx(用户组)rwx(其他用户),如果没有此权限的话用-代替) 第2列:(数量) 第3列:文件所有者 第4列:文件所属用户组(root属于root组) 第5列:文件大小
A,配置cntlm代理的命令:
sudo apt-get install cntlm vim /etc/cntlm.conf --- Proxy xxx Username xxx Domain xxx #Password xxx ###Auth ###PassNT ###PassLM NoProxy xxx Listen xxx Gateway xxx --- cntlm -c "/etc/cntlm.conf" -I -M www.liuzong.org 通过账号域名和密码验证之后,会生成正确认###字段三项更新到配置文件即可。 chrome浏览器通过SwitchyOmega和SwitchySharp配置代理ip和port即可愉快上网。
B,交互命令自动化执行
#!/usr/bin/env expect # set timeout 30 set timeout -1 spawn tar -czvf $(date +'%Y-%m-%d_%H-%M-%S').tar.gz ./data spawn ftp $srcAtIpAd expect "Name (" { send "$srcAtUser\r" } expect "Password:" { send "$srcAtPswd\r" } expect "*Remote*" send "pwd \r" send "binary \r" send "get nullptr.cpp \r" send "pwd \r" send "exit\r" expect eof spawn ssh $buildUser@$buildIpAd expect { "yes/no" { send "yes\r";exp_continue } "Password:" { send "$buildPswd\r" } } expect "*from*" send "pwd \r" send "source /etc/bashrc \r" send "ps aux | grep vsftpd.conf | grep -v grep | wc -l | awk '{if(\$1){print 1\"OK\"}else{print 0\"NG\"}}' \r" expect { "1OK" { send "ps -aux | grep andr.vsftpd.conf\r"} "0NG" { send "/usr/sbin/ftpd /root/and/andr.vsftpd.conf & \r" } } send "exit\r" expect eof spawn scp "$buildUser@$buildIpAd:$buildPath/$buildLibs" "./" expect { "yes/no" { send "yes\r";exp_continue } "Password:" { send "$buildPswd\r" } } send "exit\r" expect eof