Linux Shell基础

Linux Shell基础



测试环境:CentOS7.0



1、基础命令


1.1查看系统可用的shell


# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin



1.2查看用户的默认shell


# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

...



1.3查看本次登录之前执行过的命令


# more .bash_history



1.4Tab键的功能


补全文件名

提示命令名

提示文件名



1.5使用alias定义命令的别名


# alias lm='ls -al'



1.6type命令


# type -a cd

cd is a shellbuiltin

cd is /usr/bin/cd



1.7变量的定义


# var="lang is$LANG"

# echo $var

lang is en_US.UTF-8


# var='lang is$LANG'

# echo $var

lang is $LANG


注意单引号与双引号之间的区别。


# version=$(uname-a)

# echo $version

Linux centos73.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64x86_64 x86_64 GNU/Linux


使用unset命令取消已设置的变量:


# unset version


使变量对于子shell可用:


# export var


看看下面的例子:


# var=abc

# echo $var

abc

# bash #-->进入子shell

# echo $var #-->shell中定义的变量已经看不到了


# exit #-->退出子shell

exit

# echo $var #-->shell中变量仍然存在

abc


如果使用export的情况:


# var=abc

# export var

# bash

# echo $var

abc

# exit

exit

# echo $var

abc


当启动一个shell,操作系统会分配一记忆区块给shell使用,此内存内的变量可让子程序使用;

若在父程序利用export功能,可以让自定义变量的内容写到上述的记忆区块当中(环境变量);

当加载另一个shell,shell可以将父shell的环境变量所在的记忆区块导入自己的环境变量区块当中。


使用\转义字符可以定义变量内容为特殊符号:


# var="\\"

# echo $var

\



1.8特殊变量


注意$?是特殊的变量:


$代表当前bashPID

# echo $$

2371



?代表上一条命令的返回值,0表示上一条命令成功执行,1表示未成功执行

# cd ~

# echo $?

0

# cd /xyz

-bash: cd: /xyz: Nosuch file or directory

# echo $?

1



1.9系统变量


查看机器信息:


# echo $MACHTYPE

x86_64-pc-linux-gnu


envset


两个命令都可以用来查看环境变量,区别是未export的变量只能用set查看。


# var1=abc

# var2=def

# export var1

# env | grep var1

var1=abc

# env | grep var2

# set | grep var2

var2=def


查看系统支持的语言和编码:


# locale -a


修改语言编码:


# cat/etc/locale.conf

LANG="en_US.UTF-8"



1.10与用户交互


读取用户输入的命令read


# read -p "Enterpassword: " -t 3


-t 3 表示等待3



1.11变量类型申明


declaretypeset(功能相同):


# declare -isum=100/50

# echo $sum

2


-a:array类型

-i:integer类型

-x:export变量

-r:readonly



1.12数组的使用


定义:


# a=(1 2 3 4 5)


获取数组的长度:


# echo ${#a[@]}

5


获取数组元素:


# echo ${a[2]}

3


# echo ${a[*]}

1 2 3 4 5

赋值:


# a[1]=10

[root@centos7 ~]#echo ${a[*]}

1 10 3 4 5


删除元素:


# unset a[1]

# echo ${#a[*]}

4


也可以使用unseta直接删除整个数组。


分片:


# a=(1 2 3 4 5)

# echo ${a[@]:0:3}

1 2 3


替换:


# a=(1 2 3 4 5)

[root@centos7 ~]#echo ${a[@]/3/100}

1 2 100 4 5



1.13资源限制


查看当前限制:


# ulimit -a


设置限制:


# ulimit -f 10240



1.14变量替换


删除和替换变量中的内容:


${变量#关键词}从头删除内容,由关键词匹配最短字符串

${变量##关键词}从头删除内容,由关键词匹配最长字符串

${变量%关键词}从尾删除内容,由关键词匹配最短字符串

${变量%%关键词}从尾删除内容,由关键词匹配最长字符串

${变量/旧字符串/新字符串}替换第一个匹配

${变量//旧字符串/新字符串}替换所有的匹配


# echo $path

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# echo ${path#/*:}

/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# echo $path

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# echo ${path##/*:}

/root/bin


# echo $path

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# echo${path%/root*}

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:

# echo ${path%%*bin}

(结果为空)


# echo${path/sbin/sb/}

/usr/local/sb/:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# echo${path//sbin/sb/}

/usr/local/sb/:/usr/local/bin:/usr/sb/:/usr/bin:/root/bin




变量的替换:


#newvar=${oldvar-null}

# echo $newvar

null

# oldvar=somevalue

#newvar=${oldvar-null}

# echo $newvar

somevalue


new_var=${old_var-content}如果oldz_var已定义,取old_var的值,否则取content的值。


# oldvar=""

#newvar=${oldvar-somevalue}

# echo $newvar


#newvar=${oldvar:-somevalue}

# echo $newvar

somevalue


未设置str str="" str设置为非空

var=${str-expr} var=expr var= var=$str

var=${str:-expr} var=expr var=expr var=$str

var=${str+expr} var= var=expr var=expr

var=${str:+expr} var= var= var=expr

var=${str=expr} str=expr;var=expr str不变;var= str不变;var=$str

var={str:=expr} str=expr;var=expr str=expr;var=expr str不变;var=$str

var=${str?expr} expr输出至stderr var= var=$str

var=${str:?expr} expr输出至stderr expr输出至stderr var=$str



1.15定义命令的别名


定义:

# alias rm='rm -i'


查看:

# alias


取消别名:

# unalias rm



1.16历史命令


# history

# history3(查看前三条历史命令)

# more~/.bash_history(查看历史文件)

# history-w(将当前历史写入历史文件)

# !!(执行上一条命令)

# !vi(执行最近以vi开头的命令)

# !3(执行第三条历史命令)待验证


同一个用户打开多个bash,将只会记录最后一个退出的bash历史命令,因此可以考虑不要同时打开多个bash



1.17执行指令时的搜索顺序


从相对或绝对路径找->alias->bashbuiltin中找->$PATH中找



1.18loginnon-login


shellnon-login,执行shell脚本也是non-login


可以通过命令确认当前shelllogin还是non-login

shopt -q login_shell&& echo 'Login shell' || echo 'Not login shell'


login登录会按照下图依次加载环境变量文件:


/etc/profile ->~.bash_profile

|->/etc/inputrc |-> ~/.bashrc

|->/etc/profile.d/*.sh |->/etc/bashrc

|-> /etc/locale.conf <-|


non-login会从文件~/.bashrc开始读取。





1.19bash中的通配符


# ll -d /etc/cron*

# ll -d /etc/?????

# ll -d /etc/*[0-9]*

# ll -d /etc/[^a-z]*



1.20命令输出重定向


012分别代表stdinstdoutstderr


> >> 符号用来将stdout信息输出到文件:

> 将会创建或者覆盖输出文件

>>在输出文件中追加内容而不是覆盖它


1>代表将stdout信息以覆盖的形式重定向

2>>代表将stderr信息以追加的形式重定向

>代表将stdoutstderr信息重定向



1.21黑洞


/dev/null


移动到该设备的文件以及重定向到该设备的内容将彻底消失。



1.22使用重定向创建文本文件


# cat > testfile< ~/.bashrc



1.23命令的连接


cmd1 ; cmd2直接执行多个互不相关的命令

cmd1 && cmd2前一条命令返回0$?=0表示正常执行)则执行cmd2,否则不执行cmd2

cmd1 || cmd2前一条命令返回非0则执行cmd2,否则不执行cmd2


可以用上面的符号做条件判断:

ls /tmp/vbirding &&echo "exist" || echo "not exist"



1.24对行内容进行分解(cut命令)


-d 指定分隔符

-f 按分隔符取出第几段(field

-c 按第几个字符分割


例:

# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# echo $PATH | cut-d : -f 2

/usr/local/bin

# echo $PATH | cut-c 3-5

sr/



1.25抓取包含匹配字符串的行(grep命令)


grep命令参数如下:

-a:将binary文件以text文件的方式搜索

-c:计算找到的行的次数

-i:忽略大小写

-n:顺便输出行号

-v:抓取不包含匹配字符串的行



1.26排序命令:sortwcuniq


sort参数


-f 忽略大小写

-b 忽略最前面的空格部分

-M 以月份的名字来排序

-n 使用纯数字来排序

-r 反向排序

-u 相同的行,仅出现一次

-t 分隔符

-k 以指定的区间来排序


例:

# cat /etc/passwd |sort -t ':' -n -k 4

halt:x:7:0:halt:/sbin:/sbin/halt

operator:x:11:0:operator:/root:/sbin/nologin

root:x:0:0:root:/root:/bin/bash

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sync:x:5:0:sync:/sbin:/bin/sync

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

...

:为分隔符,已第4列按数字排序。


相同的行仅取一次(uniq命令):


uniq选项:


-i:忽略大小写字符的不同

-c:进行计数


例:

# last | cut -d ' '-f 1 | sort | uniq -c

1

11 reboot

18 root

1 wtmp


统计行数,单词数字符数(wc命令):


wc的选项:

-l:统计行数

-w:统计单词数

-m:统计字符数

-c:统计字节数


# wc -m /etc/passwd

909 /etc/passwd


双向重定向命令tee


生成两份stdout信息,一份到文件一份到screen



1.27删除或替换内容(tr命令)


tr选项:

-d:删除匹配的字符串

-s:删除重复的字符


# last | tr '[a-z]''[A-Z]'

# last | tr -d ' '

# echo 'abbcdefg' |tr -s 'b'

abcdefg



1.28合并两个文件相同字段的行(join命令)


join选项:

-t:指定分隔符

-i:忽略大小写

-1:第一个文件

-2:第二个文件


例:

join -t ':' -1 4/etc/passwd -2 3 /etc/group



1.29合并两个文件的同一行(paste命令)


paste的选项

-d:可自定义分隔符(默认以[tab]来分隔)

-:如果file部分写成-,表示来自stdin的内容


例:

# cat file1

1

2

3

# cat file2

a

b

c

# paste -d ':' file1file2

1:a

2:b

3:c



1.30tab转化为空格(expand命令)


例:

# expand -t 1 file

-t 1表示将一个tab转换为一个空格。



1.31创建文件(touchdd命令)


touch命令:


touch命令可以创建文件和修改文件时间戳:


# touch test


dd命令:


dd命令可以用来创建文件,也可以用来检测磁盘读写速度:


# dd bs=1M count=128if=/dev/zero of=test conv=fdatasync

128+0 records in

128+0 records out

134217728 bytes (134MB) copied, 2.40143 s, 55.9 MB/s

这种方式是先写入缓存,再一次性写入磁盘。


# dd bs=1M count=128if=/dev/zero of=test oflag=dsync

128+0 records in

128+0 records out

134217728 bytes (134MB) copied, 3.08738 s, 43.5 MB/s

这种方式是分128次写入磁盘,基本没有用到缓存。


1.32分割文件(split命令)


split的选项

-b:每个片的大小bkm

-l:按行分割


# dd bs=1M count=5if=/dev/zero of=test

5+0 records in

5+0 records out

5242880 bytes (5.2MB) copied, 0.00925931 s, 566 MB/s

# split -b 1M test

# ls

test xaa xab xac xad xae



1.33处理文本行(awk命令)


awk命令的使用:


awk对每一行进行循环

每一行中用分隔符分成多个域,分隔符可以用-F选项定义,如果不定义默认为空格或tab

对于每一个域可以用$N的方式获得其值,例如$1表示第一个域,而$0表示整行记录


awk有很多内部变量,常用的如下:

ARGC 命令行参数个数

ARGV 命令行参数排列

ENVIRON 支持队列中系统环境变量的使用

FILENAME awk浏览的文件名

FNR 浏览文件的记录数

FS 设置输入域分隔符,等价于命令行-F选项

NF 浏览记录的域的个数

NR 已读的记录数

OFS 输出域分隔符

ORS 输出记录分隔符

RS 控制记录分隔符


# cat /etc/passwd |awk -F ':' '{print $1}'

root

bin

daemon

adm

lp

sync

shutdown

:为分隔符,对于每一行打印出第一个字段。


# awk 'BEGIN{count=0;print "[start]user count is ", count}{count=count+1;print $0;} END{print "[end]user count is ",count}' /etc/passwd

首先定义count并打印一行,然后打印出每一行,最后打印出总行数。


# awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}'/etc/passwd

对每一行,打印出文件名,行数,列数和行的内容。



1.34stdin转化为参数(xargs命令)


一些命令不支持通过管道接收stdin,此时需要使用xargs命令将其转化为参数。

xargs默认回车为分隔符,也可以使用-d选项自定义分隔符。



xargs的参数:


-a:从文件中读入作为stdin

-0:遇到特殊字符时,将其当成一般字符

-E:当xargs分析到这个字符串时就停止工作,同时使用-d-0等情况下会失效

-p:每执行一个argument询问一次用户

-n:定义一次使用几个参数(如果使用此选项,则默认空格和换行为分隔符)

-t:先打印命令,再执行

-d:分隔符


# echo "arg1arg2 arg3 \\" | xargs -t -E 'arg3' echo

echo arg1 arg2

arg1 arg2

# echo "arg1arg2 arg3 \\" | xargs -n1 -t -E 'arg3' echo

echo arg1

arg1

echo arg2

arg2


# cat test

this line1

this line2

# cat test | xargs-t -n3 echo

echo this line1 this

this line1 this

echo line2

line2



1.35压缩和解压(tar命令)


tar的选项:


-x:解压缩文件

-v:显示处理的文件

-f:使用压缩文件

-c:创建一个新的打包文件

-z:以gzip方式压缩,文件名为*.tar.gz

-j:以bzip2方式压缩,文件名为*.tar.bz2


压缩/etc/目录到etc.tar.gz文件:

# tar -zcvfetc.tar.gz /etc


查看压缩文件内容(注意必须加上-z选项):

# tar -ztvfetc.tar.gz

解压文件(同样需要-z选项):

# tar -zxvfetc.tar.gz



2.shell script



2.1交互输入(read命令)


#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

read -p "Pleaseinput your first name: " firstname #提示使用者输入

read -p "Pleaseinput your last name: " lastname #提示使用者输入

echo -e "\nYourfull name is: $firstname $lastname" #结果由屏幕输出



2.2使用日期(date命令)


#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

echo -e "I willuse 'touch' command to create 3 files."

read -p "Pleaseinput your filename: " fileuser

#如果fileuser有值且不是空字符串,就取fileuser的值,否则取值"filename"?

filename=${fileuser:-"filename"}

#使用date指令来获得所需要的文件

date1=$(date--date='2 days ago' +%Y%m%d) #前两天的日期

date2=$(date--date='1 days ago' +%Y%m%d) #前一天的日期

date3=$(date+%Y%m%d) # 今天的日期

file1=${filename}${date1}


file2=${filename}${date2}

file3=${filename}${date3}


touch "$file1"

touch "$file2"

touch "$file3"



2.3计算


#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

echo -e "YouSHOULD input 2 numbers, I will cross them! \n"

read -p "firstnumber: " firstnu

read -p "secondnumber: " secnu

#将运算式写在$(())中,即使算式中包含空格也没有问题

total=$(($firstnu*$secnu))

echo -e "\nTheresult of $firstnu x $secnu is ==> $total"



2.4脚本执行方式的区别


sh执行脚本时,脚本是在子bash中执行。

source执行脚本时,脚本是在父bash中执行。



2.5判断(test命令)


# test -e /dmtsai &&echo "exist" || echo "Not exist"

Not exist


判断为“是”返回0,判断为“非”返回1


-e 该『档名』是否存在?(常用)

-f该『档名』是否存在且为文件(file)?(常用)

-d该『文件名』是否存在且为目录(directory)?(常用)

-b 该『档名』是否存在且为一个block device装置?

-c 该『档名』是否存在且为一个character device装置?

-S 该『档名』是否存在且为一个Socket文件?

-p 该『档名』是否存在且为一个FIFO (pipe)文件?

-L该『档名』是否存在且为一个连结文件?


-r该档名是否存在且具有『可读』的权限?

-w该档名是否存在且具有『可写』的权限?

-x该档名是否存在且具有『可执行』的权限?

-u该文件名是否存在且具有『SUID』的属性?

-g该文件名是否存在且具有『SGID』的属性?

-k该文件名是否存在且具有『Stickybit』的属性?

-s 该档名是否存在且为『非空文件』?


-nt (newerthan)file1 是否比file2

-ot (olderthan)file1 是否比file2

-ef 判断file1file2是否为同一档案,可用在判断hardlink的判定上。主要意义在判定,两个档案是否均指向同一个inode


-eq 两数值相等(equal)

-ne 两数值不等(not equal)

-gt n1 大于n2 (greater than)

-lt n1 小于n2 (less than)

-ge n1 大于等于n2 (greater than or equal)

-le n1 小于等于n2 (less than or equal)


test -z string判断string为空字符串

test -n string判断string为非空字符串

:-n亦可省略


test str1 = str2 判断str1 是否等于str2

test str1 != str2 刞定str1 是否不等于str2


-a (and)两状况同时成立!例如test -r file -a -x file

-o (or)两状况任何一个成立!例如test -r file -o -x file

! 反相状态,test ! -x file


(判断文件是否存在,并打印出文件类型以及权限)


#!/bin/bash


PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


read -p "Inputa filename" filename

test -z $filename &&echo "You MUST input a filename." && exit 0


test ! -e $filename&& echo "The filename '$filename' DO NOT exist" &&exit 0


test -f $filename &&filetype="regulare file"

test -d $filename &&filetype="directory"

test -r $filename &&perm="readable"

test -w $filename &&perm="$perm writable"

test -e $filename &&perm="$perm executable"


echo "Thefilename: $filename is a $filetype"

echo "And thepermissions are:$perm"



2.6判断符号[]


判断变量$HOME是否为空

# echo $HOME

/root

# [ -z "$HOME"] ; echo $?

1


注意:

在中括号[]内的每个组件都需要有空格键来分隔;

在中括号内的变量,最好都以双引号括号起来;

在中括号内的常数,最好都以单或双引号括号起来。



2.7shell脚本中的预设变量


$0 :代表脚本文件名;

$# :代表脚本后接的参数个数;

$@ :代表"$1""$2" "$3" "$4"...的意思,每个变量是独立的(用双引号括起来);

$*:代表"$1c$2c$3c$4",其中c为分隔字符,默认空格键。


例:


# cat test.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


echo "Thescript name is ==> $0"

echo "Totalparameter number is ==> $#"

[ "$#" -lt2 ] && echo "The number of parameter is less than 2.Stop here." && exit 0

echo "Yourwhole parameter is ==> '$@'"

echo "The 1stparameter ==> $1"

echo "THe 2ndparameter ==> $2"



# sh test.sh i youhe

The script name is==> test.sh

Total parameternumber is ==> 3

Your whole parameteris ==> 'i you he'

The 1st parameter==> i

THe 2nd parameter==> you



2.8参数偏移(shift命令)


例:


# cat test.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

echo "Totalparameter number is ==> $#"

echo "Yourwhole parameter is ==> $@"

echo "Yourfirst paramter is ==> $1"

shift

echo "Parametershave been shifted."

echo "Totalparameter number is ==> $#"

echo "Yourwhole parameter is ==> $@"

echo "Yourfirst paramter is ==> $1"


# sh test.sh onetwo three

Total parameternumber is ==> 3

Your whole parameteris ==> one two three

Your first paramteris ==> one

Parameters have beenshifted.

Total parameternumber is ==> 2

Your whole parameteris ==> two three

Your first paramteris ==> two



2.9条件判断(if语句)


if … ; then

...

fi


例:

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

read -p "Pleaseinput (Y/N): " yn

if [ "$yn"== "Y" ] || [ "$yn" == "y" ]; then

echo "OK,continue"

exit 0

fi

if [ "$yn"== "N" ] || [ "$yn" == "n" ]; then

echo "Oh,interrupt!"

exit 0

fi

echo "I don'tknow what your choice is" && exit 0


if …; then

elif …; then

else

fi


例:

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

read -p "Pleaseinput (Y/N): " yn

if [ "$yn"== "Y" ] || [ "$yn" == "y" ]; then

echo "OK,continue"

elif [ "$yn"== "N" ] || [ "$yn" == "n" ]; then

echo "Oh,interrupt!"

else

echo "I don'tknow what your choice is"

fi


例:

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


echo "Thisprogram will try to calculate :"

echo "How manydays before your demobilization date..."

read -p "Pleaseinput your demobilization date (YYYYMMDD ex>20090401): "date2


date_d=$(echo $date2|grep '[0-9]\{8\}') #看看是否有八个数字

if [ "$date_d"== "" ]; then

echo "You inputthe wrong date format...."

exit 1

fi


declare -idate_dem=`date --date="$date2" +%s`

declare -idate_now=`date +%s`


declare -idate_total_s=$(($date_dem-$date_now))

declare -idate_d=$(($date_total_s/60/60/24))

if [ "$date_total_s"-lt "0" ]; then

echo "You hadbeen demobilization before: " $((-1*$date_d)) " ago"

else

declare -idate_h=$(($(($date_total_s-$date_d*60*60*24))/60/60))

echo "You willdemobilize after $date_d days and $date_h hours."

fi



2.10条件判断(caseesac语句)


case … in

…)

;;

esac


例(只接受参数为one/two/three):


#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

case $1 in

"one")

echo "Yourchoice is ONE"

;;

"two")

echo "Yourchoice is TWO"

;;

"three")

echo "Yourchoice is THREE"

;;

*)

echo "Usage$0 {one|two|tree}"

;;

esac



2.11使用函数(function


#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


function printit(){

echo "Yourchoice is $1"

}

case $1 in

"one")

printit 1

;;

"two")

printit 2

;;

"three")

printit 3

;;

*)

echo "Usage$0 {one|two|tree}"

;;

esac


注意函数定义中的$1表示函数内部参数,而不是脚本的参数。



2.22循环


#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

while [ "$yn"!= "yes" -a "$yn" != "YES" ]

do

read -p "Pleaseinput yes/YES:" yn

done

echo "OK! youinput the corrent answer."



#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

until [ "$yn"== "yes" -o "$yn" == "YES" ]

do

read -p "Pleaseinput yes/YES to stop this program: " yn

done

echo "OK! youinput the correct answer."



#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

s=0

i=0

while [ "$i"!= "100" ]

do

i=$(($i+1))

s=$(($s+$i))

done

echo "Theresult of '1+2+3+...+100' is ==> $s"



#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

for animal in dogcat elephant

do

echo "There are${animal}s.... "

done



#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

users=$(cut -d ':'-f1 /etc/passwd)

for username in$users

do

id $username

finger $username

done



#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

network="192.168.1"

for sitenu in $(seq1 100)

do

ping -c 1 -w 1${network}.${sitenu} &> /dev/null && result=0 ||result=1

if [ "$result"== 0 ]; then

echo "Server${network}.${sitenu} is UP."

else

echo "Server${network}.${sitenu} is DOWN."

fi

done



#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

read -p "Pleaseinput a directory: " dir

if [ "$dir"== "" -o ! -d "$dir" ]; then

echo "The $diris NOT exist in your system."

exit 1

fi

filelist=$(ls $dir)

for filename in$filelist

do

perm=""

test -r"$dir/$filename" && perm="$perm readable"

test -w"$dir/$filename" && perm="$perm writable"

test -x"$dir/$filename" && perm="$perm executable"

echo "The file$dir/$filename's permission is $perm "

done



#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

read -p "Pleaseinput a number, I will count for 1+2+...+your_input: " nu

s=0

for (( i=1; i<=$nu;i=i+1 ))

do

s=$(($s+$i))

done

echo "Theresult of '1+2+3+...+$nu' is ==> $s"



2.23脚本的调试与debug


sh命令的选项:

-n:不执行脚本,仅查看是否有语法错误,没有输出表示无语法错误。

-x:执行脚本,并列出全部执行过程。

-v:执行之前,现将脚本内容输出到屏幕上。























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值