shell基础脚本

echo -e "\e[1;42m this is test \e[0m"            ‘this is test‘会被彩色打印,其中颜色由42m决定
echo -n this is test                    ‘this is test‘不会被换行
printf "%-4s %-5.1f\n"    wade 3.1            wade 3.1分别按照左对齐打印出来,并采用4s和5.1f格式

pgrep gedit                        可以查看到gedit的进程ID

export命令用来设置环境变量。至此以后,从当前shell脚本执行的任何程序都会继承这个变量
export PATH="$PATH:/home/user/bin"            在PATH中新加一条路径

var=1234567890
length=${#var}
echo $length                        获得变量的长度

echo $SHELL或者echo $0                    识别当前的shell版本

echo $UID                        如果结果为0,标示当前为root用户

echo $PS1                        显示当前bash的提示字符串,其中\u为用户名,\h为主机名,\w为当前的工作目录。

可以利用\e[1;32m设置彩色提示字符串

算数操作:

no1=4
no2=5
let result=no1+no2                    let命令可以直接执行基本的算数操作
let no1+=6
echo $result
echo $no1

result=$[no1+no2]
result=$[no1+100]                    可以使用[]操作符,和let命令类似

result=$((no1+10))                    也可以使用(())操作符,但是变量名之前需要加上$

result=`expr 3 + 4`
result=$(expr $no1+5)                    expr也可以用作类似算数操作

echo "4 * 0.45" | bc                    bc执行浮点数运算
echo "scale=2;3/8" | bc                    scale设置小数精度,scale=2表示将小数位个数设置为2

no=100
echo "obase=2;$no" | bc                    利用obase进行进制转换
no=1100100
echo "obase=10;ibase=2;$no" | bc            obase和ibase配合进行进制转换

echo "sqrt(100)" | bc                    sqrt计算平方根
echo "10^10" | bc                    ^计算平方

文本描述符:
0    stdin
1    stdout
2    stderr

echo "this is test" >temp.txt
echo "this is test 1" >>temp.txt            >等同于1>;>>等同于1>>

当命令输出错误信息时,stderr信息就会被打印出来。当一个命令发生错误并退回时,它会返回一个非0的退出状态;而当命令成功完成后,它会返回数字0。
退出状态可以从特殊变量$?中获得。

ls + 2>out.txt                        将错误输出到out.txt文件中
cmd 2>stderr.txt 1>stdout.txt                将stderr单独定向到一个文件中,将stdout重定向到另一个文件中
cmd &>output.txt                    将stderr和stdout都被重定向到同一个文件中

command | tee [-a] FILE1 FILE2                在终端中打印,并将它重定向到文件FILE1和FILE2.-a表示为追加内容选项

exec 3<input.txt                    exec命令创建自定义的文件描述符

数组和关联数组
array_var=(1,2,3,4,5)                    定义数组,以0位起始索引
array_var[0]="test"                    自定义数组
echo ${array_var[0]}                    打印出特定索引的数组元素内容
echo ${array_var[*]}                    打印所有数组的内容
echo ${#array_var[*]}                    打印数组长度

declare -A ass_array                    定义关联数组
ass_array=([index1]=val1 [index2]=val2)            内嵌索引-值列表法
ass_array[index1]=val3                    独立的索引-值
echo ${ass_array[index1]}                打印index1索引对应的值
echo ${!ass_array[*]}                    列出数组索引

alias new_command=‘command sequence‘            创建新的别名。要想永久保存,需要将其放入到~/.bashrc文件中。若想删除只需要使

用unalias命令或者从~/.bashrc中删除

tput cols                        获取终端的行数
tput lines                        获取终端的列数
tput longname                        打印出当前终端名
tput setb [0-7]                        设置终端背景色
tput bold                        设置字体为粗体

echo -e "Enter password: "
stty -echo                        禁止将输出发送到终端
read password
stty echo                        允许发送到终端
echo
echo Password read

date                            显示日期
date +%s                        以纪元时显示时间,主要用途是做时间差的秒数
date --date "jan 20 2011" +%s                按照给定日期显示纪元时
date --date "jan 20 2011" +%A                按照给定日期显示是星期几
%A    星期
%B    月
%d    日
%D    固定格式日期(mm/dd/yy)
%Y    年
%H    小时
%M    分钟
%S    秒
%N    纳秒
%s    纪元时
date "+%d %B %Y"                    按照指定格式打印时间
date -s "21 june 2015 11:12:23"                设置日期和时间

bash -x script.sh                    使用-x选项,启动跟踪调试shell脚本。打印出所执行的每一行命令以及当前状态
set -x        在执行时显示参数和命令
set +x        禁止调试
set -v        当命令进行读取时显示输入
set +v         禁止打印输入
#!/bin/bash -xv                        在/bin/bash启动xv,可以启用调试功能

function fname()
{
    statements;                    自定义函数。或者去掉function也可以
}

fname                            执行函数
fname arg1 arg2                        执行函数,传递参数
$1是函数的第一个参数
$2是函数的第二个参数
[email protected]是打印所有参数
$*是以单个实体的方式打印所有参数

递归函数
F()
{
echo $1;
F HELLO;
SLEEP 1;                        SLEEP表示休眠1秒钟
}

导出函数
export -f fname                        导出函数,扩展函数的作用域。可以扩展到子进程

FORK炸弹
:() {:|:&};:                        该函数能够调用自身,不断的生成新的进程,最终造成DDOS攻击

ls | cat -n >out.txt                    列出当前目录下的内容,cat -n追加行号存到out.txt文件中

pwd
(cd /bin;ls)                        利用()定义一个子shell
pwd

read -n 2 var                        读取2个字符并存入变量var中
read -s var                        以不回显的方式存入变量
read -p "enter input:" var                显示提示信息
read -t timeout    var                    在特定时限内读取输入
read -d "定界符" var                    用定界符结束输入行

IFS(内部字段分隔符)        默认为空

for循环
for var in list;
do
commands
done

for ((i=1;i<10;i++));
do
commands
done

echo {1..50}                        生成一个1到50的数字列表
echo {a..z}                        生成a..z的列表

while循环
while condition
do
commands
done

until循环
x=0;
until [$x -eq 9]
do
let x++;echo $x
done

if 条件;then
commands;
fi

if 条件;then
commands;
elif conditions;
then
commands;
else
commands;
fi

[condition] && action                    如果条件为真,则执行action
[condition] || action                    如果条件为假,则执行action

条件判断:
算术比较
-eq    等于
-ne    不等于
-gt    大于
-lt    小于
-ge    大于或等于
-le    小于或等于
-a    逻辑与
-o    逻辑或

文件系统相关测试
-f $var    判断var变量是否有文件
-x    判断是否有可执行文件
-d    目录
-e    文件是否存在
-c    字符设备文件
-b    块设备文件
-w    文件是否可写
-r    文件是否可读
-L    是否有符号链接

字符串比较
[[ $str1 = $str2 ]]                    当str1等于str2时,返回真。就是str1和str2包含的文本是一模一样的
[[ $str1 == $str2 ]]                    检查字符串是否相等
[[ $str1 != $str2 ]]                    字符串不同则返回真
[[ $str1 > $str2 ]]                    字符串1的字母序大于字符串2,返回真
[[ $str1 < $str2 ]]                    字符串1的字母序小于字符串2,返回真
[[ -z $str1 ]]                        若str1为空,返回真
[[ -n $str1 ]]                        若str1内容为非空,则为真

if [ $var -eq 0 ];then echo "true";fi
can be written as
if test $var -eq 0;then echo "true";fi            可以用test命令替代[]符号

cat 1.sh 2.sh                        拼接1.sh和2.sh文件内容
cat -s 1.sh                        -s选项压缩1.sh中的连续的空白行
cat 1.sh | tr -s ‘\n‘                    利用tr移除空白行
cat -T 1.sh                        将1.sh中的制表符标记成^|

script -t 2> timing.log -a output.session        timing.log用于存储时序信息,描述命令在何时运行。output.session用于存储命令输出
exit                            退出录制终端会话
scriptreplay timing.log output.session            播放录制终端会话

Terminal1输入以下命令:
mkfifo    scriptfifo
Terminal2输入以下命令:
cat scriptfifo
返回terminal1,输入以下命令:
script -f scriptfifo                    
commands;
exit                            当退出时,终端1变成广播员,终端2变成听众

find . -print                        当前目录下打印出匹配文件的文件名(路径)。其中‘\n‘作为用于分隔文件的定界符
find . -print0                        ‘\0‘作为定界符

find . -iname "example*" -print                寻找当前目录下example开头的文件,忽略大小写,并打印出来
find . \( -name "*.txt" -o -name "*.pdf" \) -print    寻找匹配多个条件中的一个并打印
find . -path "*slynus*" -print                寻找符合slynus路径
find . -regex "*slynus*" -print                以正则表达式的方式寻找路径
find . ! -name "*.txt" -print                当前目录下不是以txt为后缀的文件
find . -maxdepth 1 -type f -print            maxdepth参数指定寻找最大深度
find . -mindepth 2 -type f -print            mindepth参数指定寻找最小深度

-atime    访问时间    用户最近一次访问文件的时间
-mtime    修改时间    文件内容最后一次被修改的时间
-ctime    变化时间    文件元数据(例如权限或所有权)最后一次被改变的时间
其中-表示小于,+表示大于
-amin    访问时间    以分钟为计时
-mmin    修改时间
-cmin    变化时间
-newer    比较时间    需找比指定文件更新的所有文件

find . -type f -size +2k                寻找当前目录下文件大小大于2k的文件.
find . -type f -size -2k
find . -type f -size 2k
还可以用b/c/w/k/m/g代替k

find . -type f -name "*.txt" -delete            删除匹配的文件
find . -type f -perm 644 -print                基于文件权限匹配
find . -type f -user slynux  -print            基于文件所有权匹配

find . -type f -user root -exec chown slynux {} \;    利用exec和{}可以结合find执行命令或动作
本例的意思是将所有的符合文件全部更改其所有权为slynux用户.其中{}表示为所有符合条件的集合
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
find devel/source_path \( -name ".git" -pruns \) -o \( -type f -print \)  该命令表示打印出不包括在.git目录中的所有文件的名称(路径).使用关键字pruns

xargs命令把从stdin接收到的数据重新格式化,再将其作为参数提供给其他命令
cat example.txt | xargs                    xargs将多行输入转换成单行输出。将‘\n‘符转换成" "(空格)

cat example.txt    | xargs -n 3                指定每行最大的参数数量n,每个参数都是由" "(空格)隔开

echo "splitXsplitXsplitXsplit" | xargs -d X -n 2    利用-d选项指定分隔符,默认为IFS作为分隔符

#cecho.sh
echo $*‘#‘                        定义一个文件,当参数被传递给文件后,它会将这些参数打印出来,并以#字符作为结

#args.txt
args1
args2
args3

cat args.txt | xargs -n 1 ./cecho.sh            当需要每次提供一个参数时,指定n=1
cat args.txt | xargs     ./cecho.sh            当需要每次提供所有参数时
INPUT | xargs -n X                    每次执行脚本需要X个参数的命令时

./cecho.sh -p arg1 -l
./cecho.sh -p arg2 -l                    arg部分是唯一的可变文本

cat args.txt | xargs -I {} ./cecho.sh -p {} -l        利用-I选项配合{}指定了替换字符串,可以实现上面的执行命令

find . -type f -name "*.txt" -print0 | xargs -0 rm -f    删除匹配的文件,其中\0作为输入定界符。

find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc -l        统计源代码目录中所有C程序文件的行数

tr只能通过stdin,而无法通过命令行参数来接受输入。
tr [options] set1 set2
将来自stdin的输入字符从set1映射到set2,并输出到stdout。若set2的长度小于set1,则set2会不断重复其最后一个字符,直到长度与set1相同。如果set2的

长度大于set1,那么在set2中超出set1长度的那部分字符则完全被忽略

echo "HELLO WORLD WHO IS THIS" | tr ‘A-Z‘ ‘a-z‘        将输入字符由大写转换成小写

echo 12345 | tr ‘0-9‘ ‘9876543210‘            加密
echo 87654 | tr ‘9876543210‘ ‘0-9‘            解密

echo "hello 123 world 456" | tr -d ‘0-9‘        利用-d选项删除字符。本例结果为hello world

echo hello 1 char 2 next 4 | tr -d -c ‘0-9 \n‘        利用-c选项使用字符的补集,将去除非set1中出现的所有字符。本例结果为 1 2 4

echo "ssssss" | tr -s ‘s‘                利用-s选项压缩字符。本例压缩s,结果为s

字符类
alnum        字母和数字
alpha        字母
cntrl        控制(非打印)字符
digit        数字
graph        图形字符
lower        小写字母
print        可打印字符
punct        标点符号
space        空白字符
upper        大写字母
xdigit        十六进制字符

tr ‘[:lower:]‘ ‘[:upper:]‘

md5sum 1.sh > 1.md5                计算1.sh的校验和(32字符,十六进制)并保存到1.md5文件中

md5sum -c 1.md5                    利用生成的文件核实数据完整性

md5sum *.md5                    用所有的.md5信息来检查所有的文件

sha1sum 1.sh > 1.sha1                计算1.shd点校验和(40字符,16进制)

md5deep -rl directory_path > directory.md5    计算目录的校验和。r表示递归,l表示使用相对路径。需要安装md5deep软件包

md5sum -c directory.md5                核实目录

sort file1.txt file2.txt > sort.txt        利用sort将一组文件进行排序

cat sort.txt | uniq > uniq.txt            利用uniq找出已排序文件中不重复的行

sort -n file.txt                按数字进行排序

sort -r file.txt                按逆序进行排序

sort a.txt -o a.txt                对a.txt的文件排序

sort -M months.txt                按月份进行排序

sort -nC file.txt                检查是否按照数字进行排序

sort -m sorted1 sorted2                合并两个排过序的文件,而且不需要对合并后的文件再进行排序

sort -nrk 1 data.txt                -k指定了排序应该按照哪一个键(列号)来进行排序。

sort -u unsort.txt                只显示唯一的行
uniq -u unsort.txt                只显示唯一的行

sort unsort.txt | uniq -c            统计各行在文件中出现的次数

sort unsort.txt | uniq -d            找出文件中重复的行

sort data.txt | uniq -s 2 -w 2            -s指定可以跳过前n个字符,-w指定用于比较的最大字符数

uniq -z file.txt                用uniq命令生成包含0值字节终止符的输出

uniq -z file.txt | xargs -0 rm            删除指定的文件

temp_file=$(tempfile)                为变量temp_file赋值了一个临时文件名
temp_file="/tmp/file-$RANDOM"            加带了随机数的文件名作为临时文件名

echo $RANDOM                    总是返回一个随机数

temp_file="/tmp/var.$$"                生成带当前运行脚本的进程ID的临时文件

dd if=/dev/zero bs=100k count=1 of=data.file    生成一个大小为100KB的测试文件

split -b 10k data.file                将文件分割为多个大小为10k的文件

split -b 10k data.file -d -a 4            -d参数指定以数字为后缀,-a参数指定后缀长度

split -b 10k data.file -d -a 4 split_file    指定每个分割文件的前缀为split_file

split -l 10 data.file                -l选项指定分割文件仅有10行

csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log";rm server00.log
/SERVER/    用来匹配某一行,分割过程即从此开始
{*}        表示根据匹配重复执行分割,直到文件末尾为止。{整数}指定分割执行的次数
-s        使命令进入静默模式,不打印其他信息
-n        指定分割后的文件名后缀的数字个数
-f        指定分割后的文件名前缀
-b        指定后缀格式
因为分割后的第一个文件没有任何内容,所以删除第一个文件

file_jpg="sample.jpg"
name=${file_jpg%.*}                利用$操作符可以将名称部分从“名称.扩展名”这种格式的文件名中提取出来
echo File name is :$name

var=hack.fun.book.txt
echo    ${var%.*}    -->hack.fun.book        从右到左    
echo    ${var%%.*}    -->hack                %%符号执行非贪婪匹配

echo    ${var#*.}    -->fun.book.txt            从左到右
echo    ${var##*.}    -->txt                ##符号执行非贪婪匹配

extension=${file_jpg#*.}                利用#操作符可以将扩展名部分提取出来
echo Extension is : $extension

rename *.jpg *.JPG                    将*.jpg更名为*.JPG

目录/usr/share/dict包含了一些词典文件

命令aspell来核查某个单词是否在字典中

look android    filepath                返回filepath路径中以android开头的文件/目录

read -p "Enter number:" no                将输入内容赋值给变量no

交互式自动化:expect
#!/bin/bash
#文件名:interactive.sh
read -p "Enter number:" no
read -p "Enter name:" name
echo you have entered $no,$name;

#!/usr/bin/expect
#文件名:automate_expect.sh
spawn ./interactive.sh                    spawn参数指定需要自动化哪一个命令
expect "enter number:"                    expect参数提供需要等待的消息
send "1\n"                        send是要发送的消息
expect "enter name:"
send "hello\n"
expect eof                        expect eof指明命令交互结束

comm a.txt b.txt                    比较A.TXT和B.TXT的文件。输出的第一列包含只在a.txt中出现的行,第二列只包含在b.txt中出

现的行,第三列包含共同出现的行
comm a.txt b.txt -1 -2                    -1从输出中删除第一列,-2从输出中删除第二列,-3从输出中删除第三列

用户特殊权限:S
setuid权限允许用户以其拥有者的权限来执行可执行文件,即使这个可执行文件是由其他用户运行的
用户组特殊权限:S
setgid位允许以同该目录拥有者所在组相同的有效组权限来允许可执行文件,但是这个组和实际发起命令的用户组未必相同
其他用户特殊权限:T/t
粘滞位(sticky bit)。当一个目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即使用户组和其他用户也有写权限
如果没有设置执行权限,但是设置了粘滞位,那么使用t;如果同时设置了执行权限和粘滞位就使用T

chmod a+t directory_name                设置粘滞位
chmod 777 . -R                        以递归的方式设置权限
chown user.group . -R                    以递归的方式设置所有权
chmod +s executable_file                以不同的用户运行可执行文件
chmod u+s file                        置位setuid
chmod g+s file                        置位setgid

chattr +i file                        将文件file设置为不可修改
chattr -i file                        将文件file重新设置为可修改

touch -a file                        只更改文件访问时间
touch -m file                        只更改文件内容修改时间
touch -d "Fri Jun 25 10:20:12 IST 2012" file        -d为时间戳指定特定的时间和日期

ln -s target symbolic_link_name                创建软连接symbolic_link_name-->target

file filename                        显示文件类型信息
file -b filename                    显示不包括文件名在内的文件类型信息

环回文件系统是指那些在文件中而非物理设备中创建的文件系统

创建一个1G大小的文件
dd if=/dev/zero of=loopbackfile.img bs=1G count=1

格式化这个文件
mkfs.ext4 loopbackfile.img

检查文件系统
file loopbackfile.img

挂载环回文件
mkdir /mnt/loopback
mount -o loop loopback/img  /mnt/loopback

在内部,这个环回文件连接到一个名为/dev/loop1或者loop2的设备上,手动操作如下
losetup /dev/loop1        loopback.img
mount  /dev/loop1      /mnt/loopback

将ISO文件作为环回文件挂载
mkdir    /mnt/iso
mount -o loop linux.iso    /mnt/iso

通过sync立即应用更改
sync

创建ISO镜像
从/dev/cdrom创建一个ISO镜像
cat /dev/cdrom > image.iso

创建镜像的最好方法是用dd工具
dd if=/dev/cdrom of=image.iso

mkisofs命令创建iso文件系统
mkisofs -V "Label" -o image.iso source_dir/
    -V指定了ISO文件的的卷标,source_dir是作为ISO文件内容来源的目录路径

能够启动闪存或硬盘的混合ISO
isohybrid命令把标准ISO文件转换成混合ISO
isohybrid        image.iso  ->可用于写入USB存储设备
将ISO写入USB存储设备
dd if=image.iso   of=/dev/sdb1

命令行刻录ISO
cdrecord -v  dev=/dev/cdrom  image.iso
    -speed  速度          指定刻录速度
    -multi        刻录方式采用多区段

玩转CD ROM托盘
eject          弹出光驱托盘
eject -t          合上光驱托盘

查找文件差异并进行修补
diff  -u  version1.txt version2.txt    以一体化形式输出差距,version2.txt中没有version1.txt的文件被显示。+表示是新加入的行,-表示是删除的行

diff -u version1.txt version2.txt > version.patch 将diff的输出重定向到一个文件

patch命令配合version.patch,当应用与version1时,就可以得到version2
patch -p1 version1.txt  < version.patch        此时version1的内容和version2相同
patch -p1 version1.txt  < version.patch        再次输入该命令撤销修改

生成目录的差异信息
diff  -Naur   directory1  directory2  
    -N:将所有缺失的文件视为空文件
    -a:将所有文件视为文本文件
    -u:生成一体化输出
    -r:遍历目录下的所有文件

head   -n  4 file    指定打印前几行
head   -n  -N file    打印除了最后N行之外的所有行
seq  11   |  head -n -5        打印除了最后五行之外的所有行
seq  100  | head -n  5    打印前五行

tail       -n  5 file    打印后五行
tail       -n  +(N+1)    打印除了前N行之外的所有行
seq 100 | tail -n +6    打印第六行到第一百行
tail   -f   file    动态显示文件

查看当前路径下的目录
ls -d  */

用pushd和popd快速定位
pushd和popd可以用于在多个目录之间进行切换而无需复制粘贴。pushd和popd是以栈的方式来运作,后进先出。
pushd  /var/www        压入路径
pushd  /usr/src        压入路径
pushd  /etc        压入路径
查看栈内容
dirs
切换目录
pushd  +3    每条路径的编号是以0开始,从左到右
移除栈内容
popd            当前目录被移除
popd    +3        将第三个移除
cd -            切换到上个目录

统计行数
wc -l  file    
统计单词数
wc  -w  file
统计字符数
wc  -c   file
默认显示行数、单词数和字符数
wc  file
打印最长行的长度
wc  file  -L

打印目录树
tree    -/unixfs        树状UNIX文件系统
tree    path     -P    pattern     用通配符描述样式
tree    path    -I    pattern    只重点标出除符合样式之外的文件
tree    -h            同时打印出文件和目录的大小
tree    PATH    -H    http://localhost   -o  out.html    以html形式输出目录树

grep  match_pattern  filename     从文件中搜索

grep  word  filename  --color    重点标记处匹配到的单词

grep -E "[A-Z]+"  或者  egrep "[A-Z]+"    正则表达式查找

grep word -o file            -o选项只输出匹配到文本部分
grep  -v  word  file            -v选项打印除了匹配外的所有行
grep  -c  word  file            -c统计匹配行的数量

grep -c word file | wc -l        wc -l配合-c可以统计匹配项的数量
grep -n word file            -n选项包含匹配字符串的行数
grep  word file  -R -n        -R递归搜索

grep -i word  file            -i忽略大小写

grep -e word1 word2 file        -e匹配多个样式

grep dir --include  word        --include搜索中包含文件

grep dir --exclude word        --exclude搜索排除文件
                --exclude-dir
                --exclude-from FILE

cut按列切分文件

cut -f 2,3    filename            提取filename文件中2、3列
cut -f 3 --complement file        提取除了第三列外的所有列
cut -f 3 -d ";" file            -d指定了定界符

cut -c 1-5 file            打印前5个字符
cut -c -5 file            打印前5个字符
-c    表示字符
-b    表示字节
-f    表示定义字段
N-    从第N个字节到行尾
N-M    从第N个到第M个
-M    从第一个到第M个

cut -c1-3,6-9 file    --output-delimiter ","    指定输出定界符

sed入门
sed ‘s/pattern/replace_string/‘  file    替换给定文本中的字符串

sed -i ‘s/pattern/replace_string/‘  file    将替换结果应用于原文件

sed ‘/s/pattern/replace_string/g‘  file    替换所有符合内容

sed ‘s/pattern/replace/Ng‘ file    从第N+1处替换

sed ‘/^$/d‘  file            移除空白行

sed ‘s/\w\+/[&]/g‘        &对应于之前所匹配到的单词

sed ‘expr1‘ | ‘expr2‘    组合多个表达式

awk入门
awk  ‘BEGIN{print "start"}  pattern {commands}  END {print  "end"}‘  file

工作方式:
1,执行BEGIN {commands}语句块中的语句
2,从文件中或stdin中读取一行,然后执行pattern {commands}。重复这个过程,直到文件全部被读取完毕
3,当读至输入流末尾时,执行END {commands} 语句块
三个语句块都是可选的

echo -e "line1\nline2" | awk ‘BEGIN{print "start"} {print} END{print "END"}‘      结果如下:
start
line1
line2
end

特殊变量
NR:表示记录数量
NF:表示字段数量
$0:这个变量包含执行过程中当前行的文本内容
$1:这个变量包含第一个字段的文本内容
$2:这个变量包含第二个字段的文本内容

迭代文件中的每一行
while read line;
do
echo $line;
done < file.txt
或者
cat file.txt | (while read line;do echo $line;done)

迭代一行中的每一个单词
for word in $line;
do
echo $word;
done
迭代文件中的每一行的每一个单词
while read line;
do
    for word in $line;
    do
    echo $word;
    done
done < file.txt

迭代一个单词中的每一个字符
for ((i=0;i<${#word};i++))
do
echo ${word:i:1};
done

按列合并文件
paste  file1 file2
paste  file1 file2  -d ","    指定定界符,默认为制表符
按行合并文件
cat  file1  file2

打印文件或行中的第n个单词或列
awk ‘{print $1}‘ file
ls -l | awk ‘{print $1 ":" $4}‘

打印不同行或样式之间的文本
awk  ‘NR==M,NR==N‘  filename    打印m行到n行文本
awk  ‘/start_pattern/, /end_pattern/‘ filename    打印pattern之间的文本

邮件的正则表达式
[a-zA-Z0-9.][email protected][a-zA-Z0-9.]+\.[a-zA-Z]{2,4}

文本切片与参数操作
var="this is a line"
echo ${var/line/replace}    -->this is a replace

${variable_name:start_position:length}        -->指定字符串的起始位置和长度来生成子串
string=abcdefghijklmnopqrstuvwxyz
echo ${string:4}        -->efghijklmnopqrstuvwxyz
echo ${string:4:8}        -->efghijkl
echo ${string:(-1)}        -->x
echo ${string:(-2):2}    -->yx

网站下载
wget    url    下载网页或远程文件
wget url1 url2
wget ftp://baidu.com/somfile.jpg
wget ftp://baidu.com/somfile.jpg  -o log -O 1.jpg  -o表示日志,-O表示指定输出文件名
wget  -t  5  rul    -t指定重试次数
wget  --limit-rate  20k  url    限速下载
wget  -Q 100m url        指定下载最大限额
wget  -c     url        断点续传
curl   url            下载网页
wget  --mirror   url        复制或镜像整个网站
wget  --user  username  --password  pass url    访问需要认证的HTTP或FTP页面

以格式化纯文本形式下载网页
lynx  -dump  url > webpage_as_text.txt    将网页以ASCII字符的形式下载到文本文件中

用curl设置cookie
curl  url  --cookie  "user=slynx;pass=hack"
将cookie另存为一个文件
curl  url  --cookie-jar   cookie-file
用curl设置用户代理字符串
curl  url  --user-agent  "Mozilla/5.0"    设置用户代理为IE
限定curl可占用的带宽
curl  url  --limit-rate  20k
指定最大下载量
crul  url  --max-filesize  30k
用curl进行认证
curl  -u  user:pass  url

tar -cvf output.tar  source1 source2    创建包
tar -rvf output.tar  new_file        追加文件
tar -tvf  output.tar            列出包里的内容
tar -xvf  output.tar            提取包里的内容
tar -Af  file1.tar  file2.tar        拼接两个包文件
tar -f    output.tar  --delete file1 file2    从包文件中删除文件
tar -zcvf  output.tar.gz  source        gzip格式压缩
tar -jcvf   output.tar.bz2  source        bz2格式压缩
tar -cvf --lzma  output.tar.lzma        lzma格式压缩
tar -cf  output.tar  * --execlude "*.txt"    从归档中排除部分文件

用cpio归档
echo  file1 file2 | cpio -ov > archive.cpio

gzip  filename    压缩文件,只能压缩一个文件
gunzip  filename.gz    解压缩文件
zcat  filename.gz        读取压缩文件内容
gzip  -9  filename        压缩率
    1级的压缩率最低,但是压缩速度最快
    9级的压缩率最高,但是压缩率最慢

bzip2 filename        压缩文件
bunzip2 filename.bz2    解压缩文件
bunzip2 filename.bz2 -k    解压缩文件,保留原文件
bzip2 filename -k        压缩文件,保留原文件

lzma  filename        压缩文件
unlzma  filename.lzma    解压缩文件
lzma  filename -k        压缩保留原文件
lzma -9 filename        压缩率

超高压缩率的squashfs文件系统
mksquashfs  sources  compressedfs.squashfs    创建squashfs文件
mkdir  /mnt/squash
mount -o loop  compressedfs.squashfs  /mnt/squash

加密工具与散列
crypt   input_file   output_file    接受文件以及口令
crypt   passphrase  inputfile  encrypted_file
crypt  passphrase -d encrypted_file > outputfile  解密文件

gpg  -c  filename            加密文件
gpg  filename.gpg            解密文件

列出网络上的所有活动主机
方法一:
for ip in 192.168.0.{1..255};
do
    ping $ip -c 2 &> /dev/null;
    if [ $? -eq 0 ];
    then
        echo $ip is alive
    fi
done
方法二:
fping  -a  192.168.0.1/24 -g 2> /dev/null
或者
fping  -a 192.168.0.1 192.168.0.255 -g

传输文件
lftp  [email protected]
    cd directory    改变目录
    lcd          改变本地主机的目录
    mkdir        创建目录
    get filename    下载文件
    put filename    上传文件

sftp [email protected]
sftp -oPort=422    [email protected]    SSH端口不是默认的22时,需要指定端口

scp source destination    安全复制文件
scp  filename    [email protected]:/path
其中src和dst都可以采用形如[email protected]:/path的形式
scp -r filename     [email protected]:/path    递归复制

iwconfig命令用来为无线网卡配置合适的无线网络
iwlist scan命令可以扫描并列出可用的无线网络

lsof -i        列出系统中的开放端口以及运行在端口上的服务的详细信息
netstat -lntp        查看开放端口与服务

计算命令执行时间
time  command        计算命令的执行时间
    real时间表示挂钟时间,命令开始到结束的时间
    user时间是指进程花费在用户模式中的cpu时间,真正用于执行进程的时间
    sys时间是指进程花费在内核模式中的cpu时间

watch监视命令
watch ls    在某段时期内以固定的间隔时间不断监视某个命令的输出
watch -n 5 ‘ls -l‘    -n指定输出的时间间隔
watch -d ‘ls -l‘    -d指定命令输出差异

对文件及目录访问进行记录
inotifywait -m -r -e create,move,delete /dev/ -q

wall命令用来向所有当前登陆用户的终端写入消息
echo  "test123" | wall
wall < message

查看主机名
hostname    或者uname -n
打印linux内核版本、硬件架构等详细信息
uname -a
打印内核发行版本
uname -r
打印主机类型
uname -m
打印CPU相关信息
cat /proc/cpuinfo
打印内存的详细信息
cat /proc/meminfo
打印系统的分区信息
cat /proc/partions

cron表的格式,从左到右依次是
分钟(0-59)、小时(0-23)、天(1-31)、月份(1-12)、工作日(0-6)、命令

创建cron表:
crontab -e -u user
查看cron表:
crontab -l
移除cron表:
crontab -u user -r

$0    查看当前shell
$?    命令的返回状态,正常退出为0;非正常退出为非0
$1    执行脚本时的参数
$PS1    当前bash提示字符串
$$    当前进程ID
$UID    为0表示为root

时间: 2024-10-05 10:13:23

shell基础脚本的相关文章

Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用

一.Shell基础应用 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 切换用户的Shell环境       2> 练习命令历史.命令别名       3> 重定向标准输入/输出/错误输出       4> 管道操作实践 步骤: 步骤一:切换用户的Shell环境 若需要临时使用另一种Shell环境,可以直接执行对应的Shell解释器程序,比如只要执行ksh可以切换到ksh命令行环境. [[email protected] ~]# yum -y in

Linux之shell基础

Shell基础 一.shell概述 1) shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序. 我们输入的abc...24个字符是通过shell对照ASCII码翻译成二进制来让计算机识别的.我们从操作界面上输入命令,这个命令回车之后把此命令对照ASCII码翻译成指定的二进制,通过shell翻译成计算机内核能识别的二进制,然后内核调用硬件来处理,处理完之后再通过shell反馈给用户. 2)

shell基础(上)

Shell基础(上) 1.1什么是shell Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的 输入解释给操作系统.井处理各种各样的操作系统的输出结果,输出屏幕返回给用户 这种对话方式可以是 交互的方式:从键盘输入命令,通过/bin/bash的解折,可以立即得到shell的回应 非交互的方式:脚本 Shell执行命令分为两种方式 内置命令:如讲过的cd ,pwd, exit和echo等命令.当用户登录系统后,shell以及内置命令就被系统载入到内存,并且一直运行 一

Shell基础学习小结

0 shell基础概念 Shell是解释性语言,使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象:缺点是它们的效率通常不如编译型语言.Shell命令有本身的限制和效率问题,以下情况一般不推荐Shell: 资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等). 需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理). 有跨平台(操作系统)移植需求(一般使用C 或Java)

Linux学习 -- Shell基础 -- 概述

Shell是什么? 命令解释器 编程语言 Linux支持的Shell类型 cat /etc/shells 主要学习 bash 脚本执行方式 echo echo -e 单引号 -- 原始字符串  双引号 -- 支持转义字符串 \e[1;31m xxx  开启颜色 \e[0m    关闭颜色 首行:#!/bin/bash #写好注释 执行方式: 方式1 sh xxx.sh 方式2 chmod 755 xxx.sh  ./xxx.sh 或 绝对路径 Linux学习 -- Shell基础 -- 概述

shell编程脚本语法

学习了两个月的Linux,记住了很多命令,知道了脚本的作用,也被脚本杀死了大概一半的脑细胞,现在脚本还不能熟练运用,感觉亏了.心疼我的脑细胞,痛恨脚本,但不得不说,脚本是一个好东西啊,用起来真的方便,但是写起来真的烧脑袋呦!下面来总结一下这周学习的脚本语法,哇,语法虽然不多也不难,但是结合起来熟练运用还有一定的难度,何况现在的脚本才几行,以后要写几行,心里没点数吗!废话少说,开始 跳过最基础的命令行堆积的脚本,总结一下让脚本更简洁实用的语法 首先,条件选择if语句登场 if语句用法:常见的单分支

一、Linux Shell基础

1.1.shell基础 Bash 是一个与Bourne Shell兼容的.执行从标准输入设备文件读取的命令的语言解释器.Bash是Bournae-Again Shell的缩写.Bash与原来的Unix sh Shell向后兼容,并且融合了一些有用的Korn Shell和C Shell的特性.它相对于sh在编程和交互式使用两方面都有功能改进.另外,大部分的sh脚本可以在不修改的情况下由Bash直接运行. Linux环境由以下几部分构成: 内核-------------------Linux操作系统

shell基础part2

shell基础 一.bash中的变量 1.变量的定义:变量是计算机的内存单元,其中存放的值是可以改变的. 2.变量的设定规则:变量名不能以数字开头:变量的等号两边不能有空格,变量的值如果想有空格必须用单引号或者双引号引起来:变量的默认类型是字符串型,如果要进行计算需要指定变量类型为数值型:在变量的值中可以使用"\"转义符:变量的叠加需要使用双引号"$变量名"或者${变量名}:如果需要把命令的结果作为变量值赋予变量,则需要使用反引号或者$()包含命令:环境变量建议大写

bash shell基础特性之三(数组)

bash shell基础特性之三(数组) 一.数组定义 数组指连续的多个独立内存空间,每个内存空间相当于一个变量. bash shell只支持一维数组,但参数个数没有限制. 数组元素:数组名+索引(从0开始编号) 声明数组:declare -a ARRAR_NAME(其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组) 关联数组:declare -A ARRAY_NAME 数组元素的赋值:一次赋值全部元素.指定索引进行赋值.一次只赋值一个元素 (1) array=(var1 va