echo -e  允许将下面的反斜杠\进行解释



#!/bin/bash 表示脚本运行的shell环境


cat /etc/shells  linux 支持的shell

默认的shell echo $SHELL


将脚本定义到环境变量PATH 将脚本的绝对路径定义到PATH 就可以用脚本名字执行脚本


没有执行权限可以用sh去执行脚本,绝对路径执行需加上执行权限。

sh -x


0 标准输入

1 标准输出

2 标准错误输出

==============================================================================

echo -e  解释转移字符   \t  table   \n 换行 \b 输出多个结果时,需要结合回车键显示

    -n  回车不换行


如果要输出一个变量,并且这个变量后面要加其他字符,可将这个变量用""号包裹后,后面加其他字符

echo "$name"1

========================================================================

变量:

脚本中的变量

printenv 查看全局变量


set 查看本地变量

unset 删除变量


/etc/profile  定义全局变量


~/.bash_profile 定义本地变量

修改文件后 source 文件的绝对路径


本地变量和全局变量产生冲突,以本地变量为主。内核后加载本地变量,会覆盖掉相同的全局变量。



export 本地变量名称   临时将本地变量变为全局变量。



变量的值可以为数字、字符串、一句话

变量的名称可以有字母、下划线、数字组成,但不能一数字开头。


定义变量值为字符串时,用引号包围  sadh123也为字符串。


一个变量定义为一个数组

num=(1 2 3 4 5)

echo ${num[3]} 调取数组中的第四个变量,0表示第一个变量。

echo ${num[2]} + ${num[3]}


read 标准输入

-p  打印信息

-t  限定时间

-s  不回显           输入的值不显示,如登陆系统输入密码。

-n  输入字符个数    -n6

注意-p 最后写入

read PT     PT 表示磁盘分区

fdisk $PT << EOF

n

p

3

+223M

w

EOF

shell通常将EOF与<<结合使用,表示把text作为标准输入传给程序,

直到遇到EOF为止,再返回到语调shell

< 后接文件 表示把一个文件重定向给某某。



数学运算;

bc 计算器

scale=12  定义小数点位数

obase=2   定义为二进制

echo 'obase=2; ibase=9; 2301'|bc   #9进制转换成2进制

echo 'obase=2; 5^2'|bc    #运算结果转换成2进制

echo 'obase=2; 12'|bc     #转换成2进制


=============================================================================

逻辑运算


算术运算 test 本身不会运算,只会比较。=(eq) >(gt) <(lt) >=(ge) <=(le) ><(不等于ne)

test  判断命令,甚至连判断结果都不会显示,可以结合$?返回值来返回状态。

为真返回0 为假返回值非0


test 1 -eq 1 -a 2 -eq 2 ; echo $?   -a 表示与运算

-o  表示或运算


1. 关于某个文件名的『类型』侦测(存在与否),如 test -e filename


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

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

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

-b 该『文件名』是否为一个 block device 装置?

-c 该『文件名』是否为一个 character device 装置?

-S 该『文件名』是否为一个 Socket 文件?

-p 该『文件名』是否为一个 FIFO (pipe) 管道文件?

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


2. 关于文件的权限侦测,如 test -r filename


-r 侦测该文件名是否具有『可读』的属性?

-w 侦测该文件名是否具有『可写』的属性?

-x 侦测该文件名是否具有『可执行』的属性?

-u 侦测该文件名是否具有『SUID』的属性?

-g 侦测该文件名是否具有『SGID』的属性?

-k 侦测该文件名是否具有『Sticky bit』的属性?

-s 侦测该文件名是否为『非空白文件』?



3. 两个文件之间的比较,如: test file1 -nt file2


-nt (newer than)判断 file1 是否比 file2 新

-ot (older than)判断 file1 是否比 file2 旧

-ef 判断 file2 与 file2 是否为同一文件,可用在判断 hard link 的判定上。 主要意义在判定,两个文件是否均指向同一个 inode 哩!

硬链接indoe相同  软连接和源文件indoe不同


4. 关于两个整数之间的判定,例如 test n1 -eq n2


-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)

结合bc运算。

test `echo 100^3/100/100/100" |bc` -eq 1 ;echo $?


!test 1 -eq 2 ;echo $?

test 1 != b ; echo $?


5. 判定字符串的数据


test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true

test -n string 判定字符串是否非为 0 ?若 string 为空字符串,则为 false。

注: -n 亦可省略

test str1 = str2 判定 str1 是否等于 str2 ,若相等,则回传 true

test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false



6. 多重条件判定,例如: test -r filename -a -x filename


-a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。

-o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。

! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true

=====================================================================================

1,

if [ ];then  

command

fi

2,

if [ ]

then   如果条件成立执行command1 不成立执行command2

command1

else

command2

fi


echo $UID



if [ $UID -ne 0]

then

exit 123

fi

echo $?


2,

if [ ];then

command1

elif []; then

command2

else

command3

fi

3,

case $变量 in

"变量内容1")

command1

;;

"变量内容2")

command2

;;

*)    除以上变量外,其他所有值

command3

;;

esac


4,嵌套


if [ ];then                  

command1  

  if [ ];then

  command2

  elif [ ];then

  command3

  fi

fi


if [ $num1 -eq $unm2 ] && [ $num1 -eq $num ]  

if [ $num1 -eq $num2 -a $num1 -eq $num ]


5,

if (( 100+56/8 > 1 ))   在双括号里植入运算


if [[ $i == r* ]]   双中括号,字符串的匹配

cat >> /etc/yum.repo.d/a.repo << EOF

....

EOF



注意:


if语句 如果判断某个事物 最好使用-n 若判断正确 则执行 echo 或命令

若不正确 则执行else



1、sleep : 默认为秒。

sleep 1s 表示延迟一秒  

sleep 1m 表示延迟一分钟  

sleep 1h 表示延迟一小时  

sleep 1d 表示延迟一天    


2、usleep : 默认以微秒。  

1s = 1000ms = 1000000us

================================================================================

for  条件循环

1,for 条件    

do  

command

done


for 变量 in 变量内容

do                       echo -e -n "\b$i"

command

done


for和if语句的结合   break 跳出当前循环  break 2 跳出外循环


continue 跳过某一个条件 嵌套在if 或while中


2,

for (( i=1;i<=10;i++ ))

do

command

done

如果有补偿值,比如说是2 i=i+2

for (( i=1;i<=10;i=1+2 ))

do

command

done



for (( 初始值; 限制值; 执行步阶 ))

do

程序段

done

 初始值:某个发量在循环当中的起始值,直接以类似 i=1 设定好;

 限制值:当发量的值在这个限刢值的范围内,就继进行循环。例如 i<=100;

 执行步阶:每作一次循环时,发量的发化量。例如 i=i+1。


=============================================================================

while

1,

while [ 条件 ]    当条为真时,开始循环

do                开始循环

command

done


until [ 条件 ]    当条件为假时,开始循环

do

command

done


给while一个条件去判断,或者直接给while 一个真值

while ture  或者 while :和while ((1))

do

command

done


until  false  假值


shell中的循环不支持else


$1 $2 .....  表示键盘输入的第一,第二....输入的值

$# 判断是否输入参数。输入参数的个数

if [ $# -eq 0 ];then

$@ 表示所有的参数。

$0 表示脚本名称

================================================================================

1,调用函数:

function  代码分段,调用方便,排错简单。 ()内为参数。

function name() {

command

}   设置函数,并命名

后面可以直接调用此函数。


可以为

name() {

command

}


2,调用文件:

被调用的文件不必有#!/bin/bash   直接在里书写命令即可

source filename 调用文件   可以为绝对路径,最后在一个文件夹下


3,调用某个文件里的函数

. 文件路径

函数名



4,set 查看载入的文件

unset 函数名  删除载入的函数


5,在函数里可以定义变量

local i=.....

此变量只能在此函数里生效




函数的调用一般在启动脚本中 利用 case 调用函数

==================================================================================

shell从文件中读取值

while read i     一个参数表示安行读 如果是多个参数 f1 f2 f3... 表示读取第几列

do

echo $i

done < filename


IFS=":"   以冒号为分隔符

while read f1 f2 f7    把所有字段写全,如果不写全,会把剩下的都认为一个字段

do

echo "$f1 $2"

echo "$f7"

done < filename


=================================================================================

脚本加密

vim -X filename   可以不用-X


:X



更改和或删除密码 :set key=


注意用vim加密的文件不能执行

rpm -ivh shc-3.8.6-1.e15.rf.i386.rpm


shc -r -f filename