shell
http://bbs.chinaunix.net/thread-218853-1-1.html
shell 十三问
ps -ef
cat -n在每行前加上行号
kill pid
killall http*
mount /umount 挂载设备
df -h 查看挂载的文件系统的容量
du -sh * du -c 显示已列出文件总大小
sort 排序字符
sort -n 排序数字
pgrep 进程名 获得进程PID
grep -v t file 反选查找不含有t 在file中
grep -n 显示匹配到的行号
grep -c 统计行数 grep [tf] file 正则表达式匹配
export 设置环境变量
vim:
gg:到第一行
G:到第一行
dG:删除所有
dd:删除光标所在行
删除后可以用p命令取回,将刚删除的行输入到光标所在行
复制:yw 复制一个单词,y$ 复制光标所在行到行尾,,再用p进行粘贴
或 使用 v 进入可视模式,并移动光标选择要复制的文本,输入y复制,再用p粘贴
脚本编写:
!/bin/bash
echo -n 将文本字符串与 命令输出的结果显示在同一行
echo 中需要进行转义 如 !
printf "%-5s %-10s %-4.2f\n" %s %c %f
%-5s -表明左对齐 宽度为5的 字符串替换 %5s- 表明右对齐
echo -e 接受并识别“”内的转义字符
echo -e "1\t2\t3" ---> 1 2 3
echo -e "\e[1;31m This is red text \e[0m" \e[1;31 颜色设置为红色,\e[0m重置
echo ${#var} 打印变量长度
let result=var1+var2 -->等同于 result=var1+((var2)) result=expr $var1+$var2
计算浮点数: echo "4 * 0.56" | bc
设置小数位个数为2: echo "scale=2;3/8" | bc
设置进制转换: echo "obase=2;no" | bc 将二进制ibase转换为十进制obase
echo $? 打印前一个命令退出状态,失败返回非0
重定向前加0 1 2代表输入输出到指定文件
0标准输入 1标准输出 2标准错误
2>&1 output.out
cat a* | tee out.txt | wc -w 将cat的输出一份输出到out.txt 一份作为标准输入传给| 管道 tee相当于一个复制转发
tee -a 追加
cat<<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function:System statistics
EOF
将EOF之间的内容重定向至log.txt
array_var=(1 2 3 4 5 6)
{array_var[]} 打印所有元素 或[@]
$[#array_var[]} 打印数组长度
关联数组:类似一种键值对
declare -A ass_array
fruit=([apple]='100dollars' [orange]='150 dollars')
{!fruit[*]}
alias newCommand='command sequence'
在命令前加\ 来防止不安全的命令伪装成别名
stty -echo 禁止将输出发送至终端,stty echo 则允许发送输出
date +%s 获取时间戳时间
date "+%d %B %Y" ---> 20 May 2010
echo 对变量赋值时不用$
命令输出的内容赋值给变量: 或 $( )
输出重定向 date > test 或追加 date >> test
输入重定向: wc -l < test6
expr 1 + 5
$[ 1+5 ] 将数学运算赋值给变量
var1 * var3 * $var4)
a1 + b1
EOF
)
if 命令的退出码是否为0 即成功执行并退出
then
fi
if command
then
command
else
command
fi
test varibles 检查变量是否有内容
test 数值
n1 -eq n2
n1 -ge n2
n1 -gt n2
n1 -le n2
n1 -lt n2
n1 -ne n2
字符串:
test -n str1 检查字符串长度是否非0
test -z str1 检查是否长度为0
字符串顺序:
< 需要转义
比较大小按标准的ASCII顺序,大写字母小于小写字母
sort命令实有本地化语言定义顺序,小写字母小于大写字母
数值比较用 -gt
字符比较用 > <
文件比较:
-d file 是否存在,且为目录
-e file 文件是否存在
-f file 文件是否存在且是一个文件
-r 是否可读
-s 文件存在且非空
0 $1
-ne 不等于 not equal
if [ ]
then
echo ..
fi
ls -A | wc -w 结果为0判断目录为空
echo -n 不换行输出
echo -n enter name:
read name
read -p "Please enter your name:" name
[ -e /etc/passwd ],注意的是[]前后必须有空格,如[-e /etc/passwd]是错误的
写法
-d FILE_NAM # True if FILE_NAM is a directory
-e FILE_NAM # True if FILE_NAM exists
-f FILE_NAM # True if FILE_NAM exists and is a regular file
-r FILE_NAM # True if FILE_NAM is readable
-s FILE_NAM # True if FILE_NAM exists and is not empty
-w FILE_NAM # True if FILE_NAM has write permission
-x FILE_NAM # True if FILE_NAM is executable
字符串测试操作
-z STRING # True if STRING is empty
-n STRING # True if STRING is not empty
STRING1 = STRIN2 # True if strings are equal
STRING1 != STRIN2 # True if strings are not equal
算术测试操作
var1 -eq var2 # True if var1 is equal to var2
var1 -ne var2 # True if var1 not equal to var2
var1 -lt var2 # True if var1 is less than var2
var1 -le var2 # True if var1 is less than or equal to var2
var1 -gt var2 # True if var1 is greater than var2
var1 -ge var2 # True if var1 is greater than or equal to var2
if [ condition-is-true ]
then
command 1
command 2
...
...
command N
fi
if [ condition-is-true ]
then
command 1
elif [ condition-is-true ]
then
command 2
else
command 4
fi
case "VAR matches pattern 1
;;
pattern_2)
# commands when VAR doesnt match any of the given patterns
;;
esac
read -p "Enter the answer in Y/N: " ANSWER
case "$ANSWER" in
[yY] | [yY][eE][sS])
echo "The Answer is Yes :)"
;;
[nN] | [nN][oO])
echo "The Answer is No :("
;;
*)
echo "Invalid Answer :/"
;;
esac
COLORS="red green blue"
for COLOR in {COLOR}"
done
for (( VAR=1;VAR<N;VAR++ ))
while 循环
当所给的条件为true时,循环执行while里面的代码块
判断条件可以是任意的测试或者命令,如果测试或命令返回0,则表示条件成立,
如果为非0则退出循环,如果一开始条件就不成立,则循环永远不会执行。
while [ CONNDITION_IS_TRUE ]
do
Commands will change he entry condition
command 1
command 2
...
...
command N
done
./script.sh param1 param2 param3 param4
1 -- "param1"
3 -- "param3"
$4 -- "param4"
ping -c 1 $HOST ping 1个包
mkdir tempDir && cd tempDir && mkdir subTempDir这个例子中,如果创建
tempDir成功,执行后面的cd,继续创建subTempDir
$@ -- array of all positional parameters
function myFunc () {
echo "Shell Scripting Is Fun!"
}
myFunc # call
把函数定义在程序开始或主程序之前是一个最佳实践
通配符:
- :一些常用的通配符* 可以通配一个或多个任意字符
.txt
hello.
great*.md
?匹配一个字符
?.md
Hello?
[]匹配括号内部的任意一个字符
He[loym], [AIEOU]
[!]不匹配括号内的任何字符
[!aeiou]
预先定义的通配符 [[:alpha:]]
[[:alnum:]] [[:space:]]
[[:upper:]]] [[:lower:]]
[[:digit:]]
2>&1
2>&1表明将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出)
,为什么1前面需要&?当没有&时,1会被认为是一个普通的文件,有&表示重定向
的目标不是一个文件,而是一个文件描述符
cd /proc/pid/fd :查看指定的pid的文件描述符
ls -l
sed :只修改文件中的数据,并发送到标准输出,原文件未改变
echo "This is a test" | sed 's/test/big test/'
sed 's/原字符串/替换后的字符串/'
sed -e 's/原字符串/替换后的字符串/; s/原字符串/替换后的字符串/' file.txt
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n