Linux系统--脚本Bash

sh(全称Bourne Shell)、bash(全称Bourne Again Shell)

 

#!/bin/bash

#! 是一个约定的标记,用来告诉系统该脚本需要什么解释器来执行。

 

运行脚本

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

若想执行脚本时,执行 "test.sh",Linux系统会去PATH里寻找该文件。而只有/bin、/sbin、/usr/sbin等在PATH里。"./test.sh"表示当前目录的test.sh文件。

/bin/bash test.sh  #将脚本文件 作为解释器运行的参数
/bin/php test.php

 

 

定义变量

variable_name="this is a variable"  #定义变量 可多次定义 但必须按第一次定义的格式  注意变量与"="间不能有空格
echo $variable_name  #使用已定义的变量
echo ${variable_name} # {}可选,主要为了帮助解释器识别变量的边界
echo "I am have varaible name ${variable_name}"  #打印输出variable_name

格式:首字符必须为字母、不能使用bash里的关键字(可用help命令查看保留关键字)

 

注:PHP语言中定义变量需要加 $ 符号

variable="I want readonly variable"
readonly variable #只读变量
variable_normal="normal variable"
unset variable #删除变量,不能删除只读变量

 


字符串

#字符串可以用单引号,也可以用双引号、也可以不用引号
#单引号里的任何字符都会原样输出,即其中的变量是无效的  注:单引号字符中不能出现单引号(转移符在其中失效)
#双引号里可以有变量以及转义字符
variable_name="student"
greeting="hello, "$variable_name" !" #拼接字符串
greeting_1="hello, ${variable_name} !" #等同上一句
echo ${#greeting} #获取字符串长度
echo `expr index "$greeting" na` #查找字符n或a的位置,注意"`"是反引号

 

 

数组

array_name=(value0 value1 value2) #括号表示数组,元素用空格符号或换行符隔开
array_name1=(
value0
value1
)
array_name[0]=value0  #单独定义数组的各个分量
array_name[2]=value1  #可以不适用连续的下标,而且下标的范围没有限制
${数组名[下标]} #读取数组元素
echo ${array_name[@]} #使用@符合获取数组中的所有元素
length=${#array_name[@]} #获取数组元素个数
length=${#array_name[*]} #获取数组元素个数
lengthn=${#array_name[n]} #获取数组单个元素的长度

Bash Shell只支持一维数组

注释:#开头的行就是注释,可以将多段代码用花括号括起来,定义成一个函数,不调用相当于多行注释

 

字符串截取

echo ${var#*//} #var是变量名, *// 表示从左边开始删除第一个//号及左边的所有字符
echo ${var##*/} #  ##*/ 表示从左边开始删除至最右边的一个 / 号  即删除左边字符,保留右边字符
echo ${var%/*} #  %/* 表示从右边开始,删除第一个/号及右边的字符
echo ${var%%/*} # %%/* 表示从右边开始,删除最左边一个/号及右边的字符
echo ${var:0:5} #截取从左边第几个字符开始的几个字符
echo ${var:7} #截取 左边7个字符除外的字符
echo ${var:0-7:3} #其中0-7表示截取从右边算起第七个字符开始的3个字符
echo ${var:0-7} #截取从右边第七个字符开始的所有字符

总结:

#、##表示从左边开始删除。一个#表示从左边删除到第一个指定的字符;两个#表示从左边删除到最后一个指定的字符。

%、%%表示从右边开始删除。一个%表示从右边删除到第一个指定的字符;两个%表示从右边删除到最后一个指定的字符。

删除包括了指定的字符本身。

 

参数

执行Shell脚本时,向脚本传递参数。脚本内获取参数的格式:$n。$0代表脚本的文件名,$0代表第一个参数

$# 代表传递到脚本的参数个数

$$ 脚本运行的当前进程ID号

$! 后台运行的最后一个进程的ID号

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$*  代表以一个单字符串显示所有向脚本传递的参数。"$*"表示以"$1 $2 ... $n"的形式输出所有参数。

$@ 与$*相同。"$@"表示以"$1" "$2".."$n"的形式输出所有参数。

 

#!/bin/bash
for i in "$*";do
   echo $i
done
# ./test.sh 1 2 3
# 输出
# 1 2 3
for i in "$@";do
   echo $i
done
# 输出
# 1
# 2
# 3

 

 

运算符

expr是一款表达式计算工具,使用它就能完成表达式的求值操作。

val=`expr 2 + 2`  # 注意反引号  表达式和运算符之间要有空格
echo "两数之和为:$val"
a=$b #赋值
`expr $a \* $b` #乘法 *前必须加\转义
# [ $a == $b ] #是否相等  注意空格,[$a==$b]是错误的
# [ $a != $b ]

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

[ $a -eq $b ] #两个数是否相等,相等返回true
[ $a -ne $b ] #两个数是否不相等
[ $a -gt $b ] # >
[ $a -lt $b ] # <
[ $a -ge $b ] # >=
[ $a -le $b ] # <=
[ !false ] # 返回true  非运算
[ $a -lt 20 -o $b -gt 100 ] # -o 或运算
[ $a -lt 20 -a $b -gt 100 ] # -a 与运算
#逻辑运算符
[[ $a -lt 20 && $b -gt 100 ]] # 逻辑的AND 
[[ $a -lt 20 || $b -gt 100 ]]  # 逻辑的OR

#字符串运算符

[ $a = $b ] #检查两个字符串是否相等
[ $a != $b ] #检查两个字符串是否不相等
[ -z $a ] #检查字符串长度是否为0
[ -n $a ] #检查字符串长度是否不为0
[ $a ]检测字符串是否为空

#文件测试运算符:用于检查Unix文件的各种属性

[ -b $file ] #检查文件是否是块设备文件
[ -c $file ] #检查文件是否是字符设备文件
[ -d $file ] #检查文件是否是目录
[ -f $file ] #检查文件是否是普通文件(既不是目录,也不是设备文件)
[ -g $file ] #检查文件是否是设置SGID位
[ -k $file ] #检查文件是否是设置粘着位(Sticky Bit)
[ -p $file ] #检查文件是否是有名管道
[ -u $file ] #检查文件是否是设置SUID位
[ -r $file ] #检查文件是否是可读
[ -w $file ] #检查文件是否是可写
[ -x $file ] #检查文件是否是可执行
[ -s $file ] #检查文件是否是空(文件大小是否大于0)
[ -e $file ] #检查文件(包括目录)是否存在

 

echo命令

echo "It is a test"  #显示普通字符串
echo It is a test #省略双引号  效果同上
echo "\"It is a test\""  #显示转义字符  输出:"It is a test"

 

显示换行

echo -e "OK! \n"  # -e开启转义
echo -e "OK! \c"  # \c不换行
echo "It is a test" > myfile  #显示结果定向至文件
echo `data` #显示命令执行结果   显示当前日期


printf命令 模拟C程序库里的printf程序
printf format-string [arguments...]    #format_string格式控制字符串  arguments 参数列表

 

test命令
用于检查某个条件是否成立,它可以进行数值、字符和文件三方面的测试

num1=100
num2=100
if test $[num1] -eq $[num2]
then
   echo "相等"
else
   echo "不相等"
fi
result=$[num1+num2] #注意等号两边不能有空格   []执行基本的算数运算

str1="str"
str2="str"
if test $str1 = #str2  #测试字符串是否相等

if test -e ./bash  #测试文件是否存在

if test -e ./notFile -o -e ./bash  测试是否至少一个文件存在


流程控制
sh的流程控制不可为空,即控制体必须有语句执行

 

if语句

if condition
then
   command1
else
   command2
fi

if condition1
then
   command1
elif condition2
then
   command2
else
   command3
fi

for循环

for var in item1 itme2 ... itemN  #当变量值在列表中,执行一次所有命令
do
   command
done
for var in item item2 ... itmeN; do command;command2;done;
#注:in 列表 可以包含替换、字符串和文件名

while循环

int=1
while( ( $int<=5 ) )
do
   echo $int
   let "int++"  #Bash let命令,用于执行一个或多个表达式,变量计算中不需要加上$来表示变量
done

无限循环

while :
do
   commmand
done
#或 while true 或 for((; ;))

until语句

until condition
do
   commmand
done

case语句

case 值 in
   模式1)
    command
    ;;   #两个 分号表示break
   模式2)
     command2
     ;;
esac
#注意 case 使用 esac 作为结束标记


跳出循环   break或continue

Shell函数

[ function ] funname [()]
{
   action;
   [return int;] #参数返回,若没有return,则将以最后一条命令运行结果作为返回值。
}
#注意函数执行 不需要()括号
#函数返回值在调用该函数后通过 $? 来获得
#函数参数,在函数体内部,通过 $n 的形式来获得参数的值 仅限 1到9
#注意,$10 表示第一个参数 + '0' ${10}获得第十个参数
# $# 传递到脚本的参数个数

 

 

输入/输出重定向

#  command > file  将输出重定向到file
#  command < file  将输入重定义到file
#  command >> file 将输出以追加的方式重定向到file
#  n > file 将文件描述符为n的文件重定向到file
#  n >> file 
#  n >& m 将输出文件m和n合并
#  n <& m 将输入文件m和n合并
#  << tag 将开始标记tag和结束标记tag之间的内容作为输入

一般情况下,每个Unix/Linux命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

 

Here Doucument是Shell中的一种特殊的重定向方式,用于将输入重定向到一个交互式Shell脚本或程序。

# 格式如下
command << delimiter
   document
delimiter
# 将两个delimiter之间的内容(document)作为输入传递给command
# 注意 结尾的delimiter一定要顶格写,前面或后面都不能有任何字符,包括空格和tab缩进

#示例
$ wc -l << EOF
   欢迎来到
   CSDN
EOF
# 输出结果为2行
# wc -l 命令计算 Here Document的行数

 

/dev/null文件:用于执行某个命令,但不希望在屏幕上显示输出结果。方法:将输出重定位到  /dev/null

$ command > /dev/null
#/dev/null文件是一个特殊的文件,写入到它的内容都会被丢弃。

屏蔽stdout 和 stderr

$ command > /dev/null 2>&1  #重定向输出到文件,再将stderr重定向到stdout
# 放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符
# 文件描述符为1的文件(即/dev/stdout,stdout在file system中的映射)

顺序问题

xxx > list 2>&1  #第一种
xxx 2>&1 > list  #第二种
#第一种,先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list
#第二种,先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,
#依然是对接到stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响。

 

-c   调用选项

-p  该选项将输出格式更改为POSIX指定的格式

 

重定向

在Linux中,内核默认为每个进程打开3个描述符(标准错误2、标准输出1、标准输入0)。

cd $$ 就会进入当前进程的pid,进了这个目录,可以说是我这个程序,在这个目录当中,包含了我这个所有文件的资源,在linux系统中,这个叫做文件描述符,这个目录里边会将IOl流,映射成0、1、2、3、4、5

find / -name passwd > /dev/null 2>&1
#将find结果(标准输出)重定向到 /dev/null,同时将标准错误重定向到标准输出

 

 

1 ${BASH_SOURCE[0]}

该变量获取脚本相对于当前路径的相对路径,包含脚本文件名

2 $(dirname "${BASH_SOURCE[0]}")

该命令获取脚本所在目录,因为传给dirname命令的参数是相对路径,结果也是相对路径

3 cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd

切换到脚本所在路径,并打印脚本所在路径的绝对路径;

后续实例更新

 

Linux命令行与shell脚本编程大全

     man命令用来访问存储在Linux系统上的手册页面 q键退出

     $ man ls 进入对应ls命令的手册页面

 

文件系统

     绝对路径  以/开头, / 代表虚拟目录的根目录

     相对路径  以目录名或特殊字符开始   特殊字符 "."点代表当前目录  ".."点点代表当前目录的父目录

     $ ls    显示当前目录下的文件和目录

     $ ls --help  显示ls的可选参数说明

     $ ls -F 在显示的目录名后加正斜线'/'  可执行文件后面加星号'*' 

     $ ls -a 显示当前目录下的隐藏文件、普通文件和目录

     $ ls -l 显示每个文件的附加信息

     $ ls -i 显示每个文件的inode编号  文件或目录的inode序号是一个用于标识的唯一数字  由内核分配给文件系统的每一个对象。

     $ ls myFile*  过滤显示当前目录下以myFile开头的文件  ?代表一个字符   *代表零个或多个字符  

     $ ls [!y][a-y]Fil[es]  使用中括号扩展匹配   [a-y]代表字符取从a到y的任意字符   [!y] 代表非y的字符   [es]代表可取e或s字符

     隐藏文件通常是以点号开始的,以.bash开始的文件是bash shell环境所使用的隐藏文件

 

     $ touch fileName 创建文件,若文件存在则会更新文件的修改时间

     $ touch -a fileName 创建文件,若文件存在则会更新文件的访问时间

     

     $ cp 源对象 目标对象      复制文件到新位置  若新位置是文件路径 则覆盖 若是不存在的目录  只会创建一个相同目录名的文件

     $ cp -i 源对象 目标对象  强制shell询问是否需要覆盖已有文件

     $ cp -R Scripts/ Mod_Scripts/  递归复制Scripts目录下的内容到Mod_Scripts目录下,若不存在改目录则创建  注意参数没有带/正斜杠代表是目录

 

     链接文件在系统上维护同一个文件的多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。链接是目录中指向文件真实位置的占位符。

     在Linux中有两种不同类型的文件链接:符号链接、硬链接

     符号链接是一个实实在在的文件,指向存放在虚拟目录结构中某个地方的另一个文件。要为一个文件创建符号链接,原始文件必须事先存在。使用ln命令以及-s选项来创建符号链接,使用ln命令创建硬链接。

     硬链接会创建独立的虚拟文件,其中包含原始文件的信息,从根本上是同一个文件。引用硬链接文件等同于引用原文件。

     $ ln -s data_file sl_data_file  创建符号链接文件    会有两个inode编号,符号链接文件的信息展示会用 -> 指向源文件

     $ ln code_file hl_code_file  创建硬链接文件  只会有一个inode编号  两个文件的链接计数会是2  代表有两个链接。

     注意只能对处于同一存储媒体的文件创建硬链接。

 

    在Linux中,重命名文件称为移动   mv命令可以将文件和目录移动到另一个位置或重命名

    $ mv fileName NewFileName   重命名文件

    $ mv fileName Folder/   移动fileName文件到当前目录下的Foler目录里

    $ mv fileName Folder/NewFileName    移动并重命名文件

 

    $ rm file  删除文件

    $ rm -r My_dir 删除其中的文件,再删除目录本身

    $ mkdir New_dir 创建目录

    $ mkdir -p New_dir/Sub_dir  同时创建目录和子目录

    $ rmkdir Empty_dir   只能删除空目录

  

    $ file fileName 查看文件类型

    $ cat file   显示文本文件

    $ cat -n file  给所有行加上行号显示

    $ cat -b file  只给有文本的行加上行号

    针对大型文件  cat命令查看  文本会一晃而过

    $ more file  会分页显示文本文件内容

    $ less file    more命令的高级版, 能识别上下键以及翻页键

    $ tail file 显示文本文件最后10行   一般针对日志文件等

    $ tail -n 2 file  显示文本文件最后2行

    $ tail -2 file  显示文本文件最后2行

    $ tail -f file    允许你在其他进程使用该文件时查看文件的内容。tail命令会保持活动状态,并不断显示添加到文件中的内容。用于实时监测系统日志。

    $ head file  类似tail命令,用于查看文件开头内容。但不支持-f参数特性。

 

Linux系统管理命令

     $ ps  显示运行在系统上的所有程序的信息

     $ top 实时显示进程信息,针对ps只能显示某个特定时间点信息

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值