【技术整理】Shell脚本学习

记录某个路径

$ cd  $HOME$HOME
$ alias pmd="$HOME/pmd-bin-6.6.0/bin/run.sh pmd"

加脚本执行权限

chmod +x ./generate_wordfile.sh

$的参数意义

$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误·,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用
${var##*/} // 就是把变量var最后一个/以及左边的内容去掉
${var%/*} // 就是把变量var最后一个/以及右边的内容去掉

${var##*.} // 就是把变量var最后一个.以及左边的内容去掉
${var%.*} // 就是把变量var最后一个.以及右边的内容去掉

${var##*XYZ} // 就是把变量var最后一个XYZ以及左边的内容去掉
${var%XYZ*} // 就是把变量var最后一个XYZ以及右边的内容去掉
$() // 小括号中执行方法
${} // 大括号中放置变量名
${n} // 大括号中放数字,表示传入的第n个参数,用于参数大于等于10个时使用

数组

// 得到数组元素总个数
${#filelist1[@]}

if判断语句中的意思

[ -a FILE ] 如果 FILE 存在则为真。

[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。

[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。

[ -d FILE ] 如果 FILE 存在且是一个目录则为真。

[ -e FILE ] 如果 FILE 存在则为真。

[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。

[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。

[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。

[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。

[ -r FILE ] 如果 FILE 存在且是可读的则为真。

[ -s FILE ] 如果 FILE 存在且大小不为0则为真。

[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。

[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。

[ -x FILE ] 如果 FILE 存在且是可执行的则为真。

[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。

[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。

[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。

[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。

[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。

[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。

[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。

[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。

[ -z STRING ] “STRING” 的长度为零则为真。

[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。

[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。

[ STRING1 != STRING2 ] 如果字符串不相等则为真。

[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。

[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。

[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

变量用双引号的意义

如果变量不用双引号括起来,比如echo a变量的字符串,按照空格、制表符、换行符等符号来分割开。然后把这些分割后的每一项再按 glob 模式展开,最后把这些值,再用一个空格重新连接起来,并打印出来。

qilei@AFAAW-704030720:~$ cat a.sh
#!/bin/bash

a="1 2  3 4"
echo $a
echo "$a"

输出结果
qilei@AFAAW-704030720:~$ ./a.sh
1 2 3 4
1 2  3 4
qilei@AFAAW-704030720:~$

bash编程里的变量,全部用双引号括起来。这样更符合程序员的思路。

for 循环

for changedFilePath in ${changedFileList[@]}; do
    #do something
done

while 循环

while read -r line;do
    cp_with_backup "${line}" "${targetPath}/"
done <<< "$files"

Linux 命令

管道符号 |

用法: command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为command 2的输入传给command 2

eg. 将目录的文件的大小(size)从小到大进行输出

$ls -s|sort -nr 

grep与find

grep命令用于查找文件里符合条件的字符串

语法
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

# 只查找前三个匹配到的abc, 显示前后各五行
grep -m3 -C5 "abc" file

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;
// 若要在find到的文件中执行grep, 要以-exec开头,以 \;结尾。 {}是指通过find获得的结果
find . -type f -name "*.txt" -exec grep -H "brucezhu" {} \;

可以写成多个exec
find . -type f -name "*.txt" -exec grep -H "brucezhu" {} \; -exec echo {} \;

当前目录及子目录下查找所有以.py和.sh结尾的文件  
find . -name "*.py" -o -name "*.sh"

忽略某些方件
$(find "$JRYS_SOURCE_DIR" "(" -name "*.java" ")" \
"("  \
 -not -path "**/android/*"  \
  ")"

pcregrep

能够使用Perl Regular Expression正则查询内容的命令。(使用原始的grep无法使用断言)

安装:brew install pcre

sed

可依照script的指令,来处理、编辑文本文件。

语法
sed [-hnV][-e
                    
                    

你可能感兴趣的:(【技术整理】Shell脚本学习)