shell

2019-10-22  本文已影响0人  勇者与王者

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=((var1+var2)) result=expr $var1+$var2

计算浮点数: echo "4 * 0.56" | bc
设置小数位个数为2: echo "scale=2;3/8" | bc
设置进制转换: echo "obase=2;no" | bc 转换为2进制 no=1100100 echo "obase=10;ibase=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[0]}="test1"{array_var[]} 打印所有元素 或[@]
$[#array_var[
]} 打印数组长度

关联数组:类似一种键值对
declare -A ass_array
fruit=([apple]='100dollars' [orange]='150 dollars')
{fruit[apple]} 获取索引列表(键列表):{!fruit[*]}

alias newCommand='command sequence'
在命令前加\ 来防止不安全的命令伪装成别名

stty -echo 禁止将输出发送至终端,stty echo 则允许发送输出

date +%s 获取时间戳时间

date "+%d %B %Y" ---> 20 May 2010

echo value1 引用变量时需要 对变量赋值时不用$

命令输出的内容赋值给变量: 或 $( )

输出重定向 date > test 或追加 date >> test

输入重定向: wc -l < test6

expr 1 + 5

$[ 1+5 ] 将数学运算赋值给变量

(bc << EOF scale=4 a1=(var1 * var2 ) b1=(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" in pattern_1) # commands whenVAR matches pattern 1
;;
pattern_2)
# commands when VAR matches pattern 2 ;; *) # This will run ifVAR 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 COLORS do echo "The Color is:{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

0 -- "script.sh"1 -- "param1"
2 -- "param2"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

把函数定义在程序开始或主程序之前是一个最佳实践

通配符:

?匹配一个字符
?.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

上一篇下一篇

猜你喜欢

热点阅读