一、编写shell脚本的步骤
1:选择编辑器
1、选择系统自带的vi编辑器
2、NotePad、UE、EditPlus等
2:编写脚本
例1 example_1.sh:
#!/bin/bash
echo "Hello world"
3:赋予执行权限
chmod a+x example_1.sh
4:执行脚本
方式一: . example_1.sh
方式二: sh example_1.sh
方式三: bash example_1.sh
5:执行结果
Hello world
二、shell中的通配符
通配符用于模式匹配,如文件名匹配、路经名搜索、字符串查找等。常用的通配符有*、?和括在方括号[ ]中的字符序列。用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。
* 代表任何多个字符串,例如:“a*”匹配以a打头的任意字符串。
但应注意,文件名前的圆点(.)和路经名中的斜线(/)必须显式匹配。例如“*”不能匹配.file,而“.*”才可以匹配.file。
三、shell中的引号
单引号:由单引号括起来的所有字符,都作为普通字符,如echo '$PATH' =>$PATH
双引号:由双引号括起来的除$ ` \保留其特殊含义外,其余字符都作为普通字符 echo "`pwd`" =>输出系统日期
反引号:反引号用于设置系统命令的输出到变量。shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用,如 echo `date` =>输出系统日期
四、shell中的条件
写脚本时,有时要判断字符串是否相等,可能还要检查文件状态或是数字测试,基于这些测试才能做进一步动作。
命令用于测试字符串,文件状态和数字,也很适合if、then、else条件结构。
对文件、字符串和数字使用test命令
对数字和字符串使用expr命令
expr命令测试和执行数值输出,使用最后退出状态命令$?可测知test和expr,二者均以0表示正确,1表示返回错误。
★ 测试时使用的逻辑操作符
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
如: [ -d /opt -a -w /opt/a.sh ] 当/opt目录存在,且/opt/a.sh文件可写时,返回真,否则返回假
七、shell中的权限讲解
通过ls -l 可查看文件或目录的属性,如
-rwxr-xr-x a.sh <- 代表a.sh是一个文件>
drwxr-xr-x b
说明
★ 第一字符代表的含义如下:
d 目录。
l 符号链接(指向另一个文件)。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。
★ 文件的访问方式
读(-r): 可以显示该文件的内容
写(-w): 可以编辑或删除它
执行(-x): 如果该文件是一个shell脚本或程序,则可被执行
共同点:
如果用户对链接进行打开,修改等其实就是对目标文件的操作。
但是如果你删除了链接,源文件仍然是存在的。
如果用户对源文件进行修改,那么打开链接后,内容也发生改变了,因为源文件变了。软硬链接不占空间的(占的很小很小)
区别:
(1)软链接可以指向文件和目录;软链接只能指向文件;
(2)软链接可以跨文件系统;硬链接不可;
(3)在源文件消失后,软链接会失效,所占空间大小不变;硬链接不会失效,
它所占的空间为变成源文件的大小。基于这种特性,硬链接常用来备份。
(4)软链接指向的源文件的路径;而硬链接指向的源文件的内存地址。这也是为什么源文件被删除了。
硬链接仍能使用的原因。
1:选择编辑器
1、选择系统自带的vi编辑器
2、NotePad、UE、EditPlus等
2:编写脚本
例1 example_1.sh:
#!/bin/bash
echo "Hello world"
3:赋予执行权限
chmod a+x example_1.sh
4:执行脚本
方式一: . example_1.sh
方式二: sh example_1.sh
方式三: bash example_1.sh
5:执行结果
Hello world
二、shell中的通配符
通配符用于模式匹配,如文件名匹配、路经名搜索、字符串查找等。常用的通配符有*、?和括在方括号[ ]中的字符序列。用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。
* 代表任何多个字符串,例如:“a*”匹配以a打头的任意字符串。
但应注意,文件名前的圆点(.)和路经名中的斜线(/)必须显式匹配。例如“*”不能匹配.file,而“.*”才可以匹配.file。
? 代表任何单个字符。
[] 代表指定的一个字符范围,只要文件名中[ ]位置处的字符在[ ]中指定的范围之内,那么这个文件名就与这个模式串匹配。方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连字符(-)组成。例如,f [a- d] 与f [abcd]的作用相同。
备注:连字符“-”仅在方括号内有效,表示字符范围,如在方括号外面就成为普通字符了,而*和?只在方括号外面是通配符,若出现在方括号之内,它们也失去通配符的能力,成为普通字符了.例如:模式“- A[*?]123”只能匹配_A*123或_A?123
三、shell中的引号
单引号:由单引号括起来的所有字符,都作为普通字符,如echo '$PATH' =>$PATH
双引号:由双引号括起来的除$ ` \保留其特殊含义外,其余字符都作为普通字符 echo "`pwd`" =>输出系统日期
反引号:反引号用于设置系统命令的输出到变量。shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用,如 echo `date` =>输出系统日期
反斜线:如果下一个字符有特殊含义,反斜线防止 shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义:& * + ^ $ ` " | ?。
如 echo * => 以串行顺序打印当前整个目录列表
echo \* => 输出 *
如 echo * => 以串行顺序打印当前整个目录列表
echo \* => 输出 *
四、shell中的条件
写脚本时,有时要判断字符串是否相等,可能还要检查文件状态或是数字测试,基于这些测试才能做进一步动作。
命令用于测试字符串,文件状态和数字,也很适合if、then、else条件结构。
对文件、字符串和数字使用test命令
对数字和字符串使用expr命令
expr命令测试和执行数值输出,使用最后退出状态命令$?可测知test和expr,二者均以0表示正确,1表示返回错误。
★ 测试文件状态
test condition 或 [ condition ]
-d 目录
-s 文件长度大于0、非空
-f 正规文件
-l 符号连接
-u 文件有s u i d位设置
-r 可读
-w 可写
-x 可执行
test condition 或 [ condition ]
-d 目录
-s 文件长度大于0、非空
-f 正规文件
-l 符号连接
-u 文件有s u i d位设置
-r 可读
-w 可写
-x 可执行
如 test -d /opt 或 [ -d /opt ] =>判断/opt目录是否存在,如echo $? 则返回0,否则返回1
★ 字符串测试
test "string" string_operator "string" 或 [ "string" string_operator "string" ]
string_operator 可为:
= : 两个字符串相等
!= : 两个字符串不相等
-z : 空串
-n : 非空串
如: [ -n "abc" -a "abc" != "Abc"] =>返回真
test "string" string_operator "string" 或 [ "string" string_operator "string" ]
string_operator 可为:
= : 两个字符串相等
!= : 两个字符串不相等
-z : 空串
-n : 非空串
如: [ -n "abc" -a "abc" != "Abc"] =>返回真
★ 数值测试
test number number_operator number 或 [ number number_operator number ]
number_operator 可为:
-eq 数值相等
-ne 数值不相等
-gt 第一个数大于第二个数
-lt 第一个数小于第二个数
-le 第一个数小于等于第二个数
-ge 第一个数大于等于第二个数
如: [ "12" -le "15" ] ; echo $? => 返回真
test number number_operator number 或 [ number number_operator number ]
number_operator 可为:
-eq 数值相等
-ne 数值不相等
-gt 第一个数大于第二个数
-lt 第一个数小于第二个数
-le 第一个数小于等于第二个数
-ge 第一个数大于等于第二个数
如: [ "12" -le "15" ] ; echo $? => 返回真
★ 测试时使用的逻辑操作符
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
如: [ -d /opt -a -w /opt/a.sh ] 当/opt目录存在,且/opt/a.sh文件可写时,返回真,否则返回假
★ expr的用法
expr常用于整数值,字符串,格式如下: expr argument operator argument
同时expr也是一个手动命令计数器
如: expr 12+3 => 12+3
expr 12 + 3 => 15
expr 12 \* 3 => 36
expr "a" = "a" => 判断字符串是否相等 ,结果为真,返回1<与test不同>
expr常用于整数值,字符串,格式如下: expr argument operator argument
同时expr也是一个手动命令计数器
如: expr 12+3 => 12+3
expr 12 + 3 => 15
expr 12 \* 3 => 36
expr "a" = "a" => 判断字符串是否相等 ,结果为真,返回1<与test不同>
B=`expr 1 + 1`
echo $B => 2
echo $B => 2
五、shell中的控制结构
★ if then else 语句
例:
if [ "90" -lt "100" ];then
echo "yes, 90 is less than 100"
else
echo "no, 90 is more than 100 "
fi
★ if then else 语句
例:
if [ "90" -lt "100" ];then
echo "yes, 90 is less than 100"
else
echo "no, 90 is more than 100 "
fi
★ case 语句
例:
echo -n "enter a number from 1 to 3:"
read NUM
case $NUM in
1) echo "you select 1"
;;
2) echo "you select 2"
;;
3) echo "you select 3"
;;
*) echo "error! $0:This is not between 1 to 3" >$2
exit 1
;;
esac
例:
echo -n "enter a number from 1 to 3:"
read NUM
case $NUM in
1) echo "you select 1"
;;
2) echo "you select 2"
;;
3) echo "you select 3"
;;
*) echo "error! $0:This is not between 1 to 3" >$2
exit 1
;;
esac
★ for 循环
例1:
#!/bin/bash
for i in 1 2 3
do
echo $i
done
==> 运行,输出
1
2
3
例1:
#!/bin/bash
for i in 1 2 3
do
echo $i
done
==> 运行,输出
1
2
3
例2:
#!/bin/bash
for((i=0 ; i<2 ; i++))
do
echo $i
done
==> 运行,输出
0
1
备注:
((表达式)) 双括号表示计算表达式的值,
$((表达式)) 取表达式的值
★ while 循环
表示条件为真时执行,直达条件为假时停止执行
例:
#!/bin/bash
#!/bin/bash
for((i=0 ; i<2 ; i++))
do
echo $i
done
==> 运行,输出
0
1
备注:
((表达式)) 双括号表示计算表达式的值,
$((表达式)) 取表达式的值
★ while 循环
表示条件为真时执行,直达条件为假时停止执行
例:
#!/bin/bash
A=0
while [ $A -lt 2 ]
do
A=`expr $A + 1`
echo $A
done
==> 运行,输出
1
2
★ until 循环
表示条件为假时执行,直到条件为真时停止执行
例:
#!/bin/bash
A=0
until [ $A -gt 2 ]
do
A=`expr $A + 1`
echo $A
done
==> 运行,输出
1
2
3
while [ $A -lt 2 ]
do
A=`expr $A + 1`
echo $A
done
==> 运行,输出
1
2
★ until 循环
表示条件为假时执行,直到条件为真时停止执行
例:
#!/bin/bash
A=0
until [ $A -gt 2 ]
do
A=`expr $A + 1`
echo $A
done
==> 运行,输出
1
2
3
★ break . continue
break : 可用于case语句,在循环中使用,表示直接退出循环
continue: 只能用于循环语句中,表示退出当次循环
break : 可用于case语句,在循环中使用,表示直接退出循环
continue: 只能用于循环语句中,表示退出当次循环
例:
#!/bin/bash
for((i=0 ; i<5 ; i++))
do
if [ $i -eq 2 ] ; then
continue
fi
#!/bin/bash
for((i=0 ; i<5 ; i++))
do
if [ $i -eq 2 ] ; then
continue
fi
if [ $i -eq 4 ] ; then
break
fi
break
fi
echo $i
done
==> 运行,输出
0
1
3
六、shell中的函数
步骤:
1.将包含函数的文件载入到shell中
. out.main 或./ out.main
done
==> 运行,输出
0
1
3
六、shell中的函数
步骤:
1.将包含函数的文件载入到shell中
. out.main 或./ out.main
# file out.main content
output_info()
{
echo "output information"
}
2.检查载入是否成功 set | grep output_info
3.使用文件中已经定义的函数
output_info 只需给出函数名即可,不需A(),否则报错
输出=>output information
4.删除函数 unset output_info
output_info()
{
echo "output information"
}
2.检查载入是否成功 set | grep output_info
3.使用文件中已经定义的函数
output_info 只需给出函数名即可,不需A(),否则报错
输出=>output information
4.删除函数 unset output_info
如需重新使用A,需重复步骤1..4
七、shell中的权限讲解
通过ls -l 可查看文件或目录的属性,如
-rwxr-xr-x a.sh <- 代表a.sh是一个文件>
drwxr-xr-x b
说明
★ 第一字符代表的含义如下:
d 目录。
l 符号链接(指向另一个文件)。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。
★ 文件的访问方式
读(-r): 可以显示该文件的内容
写(-w): 可以编辑或删除它
执行(-x): 如果该文件是一个shell脚本或程序,则可被执行
★ 文件的权限:
文件属主(-u): 创建该文件的用户
同组用户(-g): 拥有该文件的用户组中的任何用户
用户(-o): 即不属于拥有该文件的用户组的某一个用户
所有用户(-a): 一切的用户
文件属主(-u): 创建该文件的用户
同组用户(-g): 拥有该文件的用户组中的任何用户
用户(-o): 即不属于拥有该文件的用户组的某一个用户
所有用户(-a): 一切的用户
★ 除第一个字符外,每3个数字代表一个权限位
-rwxr-xr-x,划分权限位之后为:rwx r-x r-x
-rwxr-xr-x,划分权限位之后为:rwx r-x r-x
★ 有两种方式可修改文件的权限
方式一:
chmod [who] operator [permission] filename
w h o的含义是:
u 文件属主权限。
g 同组用户权限。
o 其他用户权限。
a 所有用户(文件属主、同组用户及其他用户)。
chmod [who] operator [permission] filename
w h o的含义是:
u 文件属主权限。
g 同组用户权限。
o 其他用户权限。
a 所有用户(文件属主、同组用户及其他用户)。
o p e r a t o r的含义:
+ 增加权限。
- 取消权限。
= 设定权限。
+ 增加权限。
- 取消权限。
= 设定权限。
p e r m i s s i o n的含义:
r 读权限。
w 写权限。
x 执行权限。
r 读权限。
w 写权限。
x 执行权限。
如: chmod -R u=x name_dir (给目录name_dir及其子目录/文件的文件属主赋予执行的权限)
方式二
chmod [mode] file
mode 每一个权限位用一个八进制数表示,如551
读(-r) : 4
写(-w) : 2
执行(-x): 1
如: chmod 751 file_name =>file_name文件的属主具有可读,可写,可执行的权限;
file_name文件属主所在的组具有可读,可执行的权限,没有可写的权限
file_name文件属主所在组的其他用户具有可执行的权限,没有读,写的权限
★ umask
umask:当最初登录到系统中时,umask命令确定创建目录和文件的缺省模式<如读,写等>
输入umask命令,可查看当前用户,umask的值 如(0022)
当umask=022,那当怎样确定当前用户创建目录和文件的缺省模式,步骤如下:
步骤一:所有用户都具有最高权限777
步骤二:777-022的值,即为当前用户创建目录时的默认权限755
步骤三:666-022的值,即为当前用户创建文件时的默认权限644
方式二
chmod [mode] file
mode 每一个权限位用一个八进制数表示,如551
读(-r) : 4
写(-w) : 2
执行(-x): 1
如: chmod 751 file_name =>file_name文件的属主具有可读,可写,可执行的权限;
file_name文件属主所在的组具有可读,可执行的权限,没有可写的权限
file_name文件属主所在组的其他用户具有可执行的权限,没有读,写的权限
★ umask
umask:当最初登录到系统中时,umask命令确定创建目录和文件的缺省模式<如读,写等>
输入umask命令,可查看当前用户,umask的值 如(0022)
当umask=022,那当怎样确定当前用户创建目录和文件的缺省模式,步骤如下:
步骤一:所有用户都具有最高权限777
步骤二:777-022的值,即为当前用户创建目录时的默认权限755
步骤三:666-022的值,即为当前用户创建文件时的默认权限644
八、硬链接和软链接
Linux系统下的符号链接有两种类型的链接,硬链接、软链接
软链接:类似与windows系统的快捷方式,其实windows的快捷方式就是基于linux的软链接机制实现的
硬链接:也是源文件的一种快捷方式,它只能指向文件而不能指向目录。
Linux系统下的符号链接有两种类型的链接,硬链接、软链接
软链接:类似与windows系统的快捷方式,其实windows的快捷方式就是基于linux的软链接机制实现的
硬链接:也是源文件的一种快捷方式,它只能指向文件而不能指向目录。
共同点:
如果用户对链接进行打开,修改等其实就是对目标文件的操作。
但是如果你删除了链接,源文件仍然是存在的。
如果用户对源文件进行修改,那么打开链接后,内容也发生改变了,因为源文件变了。软硬链接不占空间的(占的很小很小)
区别:
(1)软链接可以指向文件和目录;软链接只能指向文件;
(2)软链接可以跨文件系统;硬链接不可;
(3)在源文件消失后,软链接会失效,所占空间大小不变;硬链接不会失效,
它所占的空间为变成源文件的大小。基于这种特性,硬链接常用来备份。
(4)软链接指向的源文件的路径;而硬链接指向的源文件的内存地址。这也是为什么源文件被删除了。
硬链接仍能使用的原因。
命令:
软链接: ln [-s] 源路径 链接名字
硬链接: ln 源路径 链接名字
九、特定变量
$?: 记录上次命令执行的结果,0:代表成功,非0:代表失败
$1 ~ $9 : 代表传递给脚本的参数名
$#: 代表传递给脚本的参数个数
软链接: ln [-s] 源路径 链接名字
硬链接: ln 源路径 链接名字
九、特定变量
$?: 记录上次命令执行的结果,0:代表成功,非0:代表失败
$1 ~ $9 : 代表传递给脚本的参数名
$#: 代表传递给脚本的参数个数