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