命令格式:command [-potions] param1 param2 ...
read myvar 交互式对变量赋值
basename $0 去掉位置参数的路径 ./run.sh --> run.sh
dirname $0
$0 命令本身的名称,$# 参数的数目,$*和$@相同为参数本身的列表,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组
后台进程PID被赋予$!,$$是shell自身的进程ID,$?表示上一次运行命令的返回码 0表示运行成功。
unset myvar 删除变量
${#myvar} 变量字符数目
echo ${!myvar} 变量myvar值的变量值
${myvar:-defalutVal},${myvar:=defalutVal}(对往后代码的此变量有效) 赋予myvar默认值
echo $myvar | tr '[a-z]' '[A-Z]' 把myvar的小写转换成大写
${myvar:3},${myvar:3:2},${myvar: -3}(从尾开始),${myvar#word}(裁剪),${myvar##word}(贪婪),${myvar%word}(从结尾开始),${myvar%%word} 字符串剪切
seq [选项]... 首数 增量 尾数 产生从某个数到另外一个数之间的所有整数
set -f (或者 set -o noglob) 关闭文件名扩展名,+f 开启
man test,shopt 命令
IFS 是内部的域分隔符 默认值为:空白(包括:空格,tab, 和新行)
let a=$a+1,a=`expr $a + 1` a=$((1 + 1)) 计算
echo "test" | tee myfile 输出同时导向stdout与文件。
exec cmd 当前运行的进程替换为另一个
ls /etc/hosts > out 2> err
command > file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.
读取顺序:su - 会顺序读取/etc/profile,~/.bashrc,~/.bash_profile ;su 会读取~/.bashrc
history | tail -7 查看历史命令
jobs -l 显示所有作业的PID,作业号,状态,命令行
fg和bg将指定的作业带到前后台。 fg %2(jobs的作业号) 按下Ctrl与z 可以将一个正在前台执行的命令放到后台,并且暂停。bg $number 继续后台执行。
stat 显示文件详细属性信息
cat -ne file。tac file 翻转文件
here文档:
cat <<EOF > file
(内容)
EOF (当Shell看到"<<"的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。)
mktemp 在/tmp下创建文件名唯一的临时文件,在标准输出中返回文件名
join -j2 -a1 f1 f2 根据两个文件中的公共键组合文件(条件:两个文件必须按键进行排序,输入与输出文件都必须有相同的定界符)
grep -i(不区分大小写) -l(只列出匹配文件的名称) -w(只进行全字匹配) -v(反选,仅列出与模式不匹配的行) -e(多个搜索grep -e a -e b file)。
-A(after 匹配之后) -B(before 匹配之前) -C(context 匹配前后)
正则表达式
split -b 1m -d file 后缀名 。文件分割
touch -d "2013-01-01" file 更新文件的时间戳,修改inode细节,无法用来修改文件的更改时间。
find / -exec ls -l {} \; find -exec对匹配的文件运行命令,文件名放在占位符{}所在位置,以分号结束(\为转义)
echo "a:b:c" | cut -d: -f1 。剪切。输出a
echo -n(不换行) -e(翻译反斜杠,\n 翻译为换行) "abc"
fmt 格式化文本行
od 查看特殊格式的文件内容
paste -d, file1 file2;seq 1 27 | paste -s(每个文件合并成行) -d"\t\t\t\n" - - (对每一个-,从标准输入中读一次数据) 与cut相反,将多个文件粘贴在一起。
pr -T -4 file 格式化
printf "%-10s %-20s" "str1" "str2" 字符串左对齐,宽度至少10个字符。
sort -k2n -k6M file 排序
uniq -u -f1 显示唯一的行,常与sort|uniq组合
dos2unix,unix2dos
date -d "last-month" +%Y-%m-%d,date -d "1 days" 时间
factor number 生产素数因子
md5sum file,md5sum -c file.md5 文件files和该文件的file.md5文件放在同一个目录下
xargs ls | xargs -t -i mv {} {}.bak -i 选项告诉 xargs 用每项的名称替换 {}。
awk '{pattern + action}' pattern 表示 AWK 在数据中查找的内容,就是要表示的正则表达式,用斜杠括起来。,而 action 是在找到匹配内容时所执行的一系列命令
awk -F ',' '/^101/ {print $1"\t"$7}'
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
rename 被替换掉的字符串 被替换掉的字符串 匹配要替换的文件模式 例如:rename foo foo0 foo?
单引号(' ')和双引号类似,它不允许解释变量引用,在单引号内,除了字符单引号,每个特殊字符都只是字面的意思
vim scp://username@host//path/to/somefile vi一个远程文件
curl ifconfig.me 在内网下查看公网ip
if 语句:
if [];then
...
elif [];then
...
else
...
fi
if [[ =~(.*)\.txt ]] && [ -r "$filename" ]; 正则表达式。match是 ${BASH_REMATCH[1]}
case 语句:
case $input in
s1) ... ;;
s2) ... ;;
*) ...;;
esac
for 循环语句:
for file in test{1,2,3}.txt
for fruit in $fruit (#注:fruit="a b c")
do
...
done
for (( i=1;i<10;i++ )) (#注:for i in `seq 1 10`)
do
...
done
while 循环语句:
while [ ... ]
do
... break(or continue) 2 (#注:不写默认break(continue)为1层循环)
done
while read m1 m2
do
...
done < $file1
while : 无限循环
do
...
done
until 循环语句:(#测试条件和while相反)
until [ .. ]
do
...
done
select 循环语句:
PS3="choose your item" (#默认提示符为:'#?',可以通过PS3变量)
select item in one two
do
$REPLY,$item (#REPLY为用户输入的任何合法或者非法值,如果非法item为空,合法item为one,two其中的一个)
done
函数:
myfunction() { (#return返回是字节,只能表示0~255)
echo $1
local myvar 加上local告诉bash变量和外部的同名变量是不同的(#变量就是一个简单的linux变量,没有作用域的概念。)
}
trap myfunction 1 2 3 6 9 函数陷阱,用于捕获信号。
. ./lib 引用lib函数库。库引用库可继承
while getopts 'i:b:q' argv 传递参数
do
case $argv in
i) $OPTARG (参数值)
b) ..
q) ..
?) ..
esac
done
数组赋值:
一次一个:
arr[1]=1
arr[2]=2
一次全部:
arr=(1 2)
按索引:
arr=([0]=1 [1]=2 [3]=4)
其他:
arr=( $(cat a.txt) ),arr=( `cat a.txt` )
arr=( *.txt )
arr1=( "${arr[@]}" )
arr1+=( "${arr[@]}" )
read -a arr
while IFS=: read -a arr (#IFS和read写在一行,IFS只对read有效,不影响其他命令)
do
done < filename
数组访问:
${arr[0]} 省略索引,默认访问第一个元素
${#arr[@]},${#arr[*]} 数组元素个数
${#arr[1]} arr[1]字符个数
${arr[@]:3},${arr[@]:3:2}
echo $LANG 当前语言(zh_CN.UTF-8,en_US,zh_CN.GB18030)环境
set fileformat=unix
win编写sh上传到linux文件类型为dos。运行时会出现: /bin/bash^M: badinterpreter: 没有那个文件或目录。在vi中 :set fileformat可以查看文件的操作系统类型。需要修改成:setfileformat=unix。
alias hdfs='hadoop fs' 修改命令别名。
read myvar 交互式对变量赋值
basename $0 去掉位置参数的路径 ./run.sh --> run.sh
dirname $0
$0 命令本身的名称,$# 参数的数目,$*和$@相同为参数本身的列表,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组
后台进程PID被赋予$!,$$是shell自身的进程ID,$?表示上一次运行命令的返回码 0表示运行成功。
unset myvar 删除变量
${#myvar} 变量字符数目
echo ${!myvar} 变量myvar值的变量值
${myvar:-defalutVal},${myvar:=defalutVal}(对往后代码的此变量有效) 赋予myvar默认值
echo $myvar | tr '[a-z]' '[A-Z]' 把myvar的小写转换成大写
${myvar:3},${myvar:3:2},${myvar: -3}(从尾开始),${myvar#word}(裁剪),${myvar##word}(贪婪),${myvar%word}(从结尾开始),${myvar%%word} 字符串剪切
sed -i s/old/new/g myfile ,echo "$myvar" | sed s/old/new/g (sed s/old/new/2 替换第二个old) 替换字符
sed配合find批量替换:find . -type f -name "*.xml" | xargs sed -i s/old/new/g 替换查找到文件的字符
echo ${myvar/old/new}(替换第一个), ${myvar//old/new},${myvar/#old/new}(开头是old),${myvar/%old/new}(结尾是old) 变量替换seq [选项]... 首数 增量 尾数 产生从某个数到另外一个数之间的所有整数
set -f (或者 set -o noglob) 关闭文件名扩展名,+f 开启
man test,shopt 命令
IFS 是内部的域分隔符 默认值为:空白(包括:空格,tab, 和新行)
let a=$a+1,a=`expr $a + 1` a=$((1 + 1)) 计算
echo "test" | tee myfile 输出同时导向stdout与文件。
exec cmd 当前运行的进程替换为另一个
ls /etc/hosts > out 2> err
command > file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.
读取顺序:su - 会顺序读取/etc/profile,~/.bashrc,~/.bash_profile ;su 会读取~/.bashrc
history | tail -7 查看历史命令
jobs -l 显示所有作业的PID,作业号,状态,命令行
fg和bg将指定的作业带到前后台。 fg %2(jobs的作业号) 按下Ctrl与z 可以将一个正在前台执行的命令放到后台,并且暂停。bg $number 继续后台执行。
stat 显示文件详细属性信息
cat -ne file。tac file 翻转文件
here文档:
cat <<EOF > file
(内容)
EOF (当Shell看到"<<"的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。)
mktemp 在/tmp下创建文件名唯一的临时文件,在标准输出中返回文件名
join -j2 -a1 f1 f2 根据两个文件中的公共键组合文件(条件:两个文件必须按键进行排序,输入与输出文件都必须有相同的定界符)
grep -i(不区分大小写) -l(只列出匹配文件的名称) -w(只进行全字匹配) -v(反选,仅列出与模式不匹配的行) -e(多个搜索grep -e a -e b file)。
-A(after 匹配之后) -B(before 匹配之前) -C(context 匹配前后)
正则表达式
split -b 1m -d file 后缀名 。文件分割
touch -d "2013-01-01" file 更新文件的时间戳,修改inode细节,无法用来修改文件的更改时间。
find / -exec ls -l {} \; find -exec对匹配的文件运行命令,文件名放在占位符{}所在位置,以分号结束(\为转义)
echo "a:b:c" | cut -d: -f1 。剪切。输出a
echo -n(不换行) -e(翻译反斜杠,\n 翻译为换行) "abc"
fmt 格式化文本行
od 查看特殊格式的文件内容
paste -d, file1 file2;seq 1 27 | paste -s(每个文件合并成行) -d"\t\t\t\n" - - (对每一个-,从标准输入中读一次数据) 与cut相反,将多个文件粘贴在一起。
pr -T -4 file 格式化
printf "%-10s %-20s" "str1" "str2" 字符串左对齐,宽度至少10个字符。
sort -k2n -k6M file 排序
uniq -u -f1 显示唯一的行,常与sort|uniq组合
dos2unix,unix2dos
date -d "last-month" +%Y-%m-%d,date -d "1 days" 时间
factor number 生产素数因子
md5sum file,md5sum -c file.md5 文件files和该文件的file.md5文件放在同一个目录下
xargs ls | xargs -t -i mv {} {}.bak -i 选项告诉 xargs 用每项的名称替换 {}。
awk '{pattern + action}' pattern 表示 AWK 在数据中查找的内容,就是要表示的正则表达式,用斜杠括起来。,而 action 是在找到匹配内容时所执行的一系列命令
awk -F ',' '/^101/ {print $1"\t"$7}'
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
rename 被替换掉的字符串 被替换掉的字符串 匹配要替换的文件模式 例如:rename foo foo0 foo?
单引号(' ')和双引号类似,它不允许解释变量引用,在单引号内,除了字符单引号,每个特殊字符都只是字面的意思
vim scp://username@host//path/to/somefile vi一个远程文件
curl ifconfig.me 在内网下查看公网ip
if 语句:
if [];then
...
elif [];then
...
else
...
fi
if [[ =~(.*)\.txt ]] && [ -r "$filename" ]; 正则表达式。match是 ${BASH_REMATCH[1]}
case 语句:
case $input in
s1) ... ;;
s2) ... ;;
*) ...;;
esac
for 循环语句:
for file in test{1,2,3}.txt
for fruit in $fruit (#注:fruit="a b c")
do
...
done
for (( i=1;i<10;i++ )) (#注:for i in `seq 1 10`)
do
...
done
while 循环语句:
while [ ... ]
do
... break(or continue) 2 (#注:不写默认break(continue)为1层循环)
done
while read m1 m2
do
...
done < $file1
while : 无限循环
do
...
done
until 循环语句:(#测试条件和while相反)
until [ .. ]
do
...
done
select 循环语句:
PS3="choose your item" (#默认提示符为:'#?',可以通过PS3变量)
select item in one two
do
$REPLY,$item (#REPLY为用户输入的任何合法或者非法值,如果非法item为空,合法item为one,two其中的一个)
done
函数:
myfunction() { (#return返回是字节,只能表示0~255)
echo $1
local myvar 加上local告诉bash变量和外部的同名变量是不同的(#变量就是一个简单的linux变量,没有作用域的概念。)
}
trap myfunction 1 2 3 6 9 函数陷阱,用于捕获信号。
. ./lib 引用lib函数库。库引用库可继承
while getopts 'i:b:q' argv 传递参数
do
case $argv in
i) $OPTARG (参数值)
b) ..
q) ..
?) ..
esac
done
数组赋值:
一次一个:
arr[1]=1
arr[2]=2
一次全部:
arr=(1 2)
按索引:
arr=([0]=1 [1]=2 [3]=4)
其他:
arr=( $(cat a.txt) ),arr=( `cat a.txt` )
arr=( *.txt )
arr1=( "${arr[@]}" )
arr1+=( "${arr[@]}" )
read -a arr
while IFS=: read -a arr (#IFS和read写在一行,IFS只对read有效,不影响其他命令)
do
done < filename
数组访问:
${arr[0]} 省略索引,默认访问第一个元素
${#arr[@]},${#arr[*]} 数组元素个数
${#arr[1]} arr[1]字符个数
${arr[@]:3},${arr[@]:3:2}