shell基础知识

变量定义的基本规则

  1. 区分大小写,同名称但大小写不同的变量名是不同的变量
  2. 定义时的格式要注意,等号两边不能有空格,对于有空格的字符串做为赋值时,要用引号引起来
  3. 单引号与双引号的区别: 单引号内的变量或者特殊字符仅为一般字符,但双引号内的变量或者特殊字符可以保持它的变量特性

变量定义的基本方式

  1. 直接把值赋值给变量
        a=1
  1. 命令的执行结果可以做为变量的值赋值给变量
 
 
符号说明
` ` 反撇号 (在键盘ESC键下面,TAB键上面的那个按键) 执行符号,用于执行符号内的命令
$( ) 执行符号,用于执行符号内的命令(建议)
         
  1. 通过read交互式定义变量
read命令常用参数说明
-p 交互对话提示信息
-s 隐藏输入
-n接数字 指定交互最多只能输入几位字符
-t接数字 批定交互的时间最多只能几秒
 
        4.替换符
            file=/dir1/dir2/dir3/my.file.txt
            我们可以用 ${ } 分别替换获得不同的值:
            ${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
            ${file#*1/}:拿掉第二条 / 及其左边的字符串:dir2/dir3/my.file.txt
            ${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt
            ${file#*.}:拿掉第一个 .  及其左边的字符串:file.txt
            ${file##*.}:拿掉最后一个 .  及其左边的字符串:txt
            ${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
            ${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)
            ${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
            ${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

            我们也可以对变量值里的字符串作替换:
            ${file/dir/path}:将第一个dir替换为 path/path1/dir2/dir3/my.file.txt
            ${file//dir/path}:将全部dir替换为 path/path1/path2/path3/my.file.txt
  • 系统变量(内置bash中变量): shell本身已经固定好了它的名字和作用,可以直接在shell脚本中调用。
内置变量说明
$? (==重点==) 上一条命令执行后返回的状态,当返回0时表示执行正常,非0表示执行异常或出错
$$ 当前所在进程的进程号(pid) 如: # kill -9 $$会退出当前会话
$0 当前执行的程序名称 如: 在脚本里sh $0代表重新执行此脚本(会产生子进程)
$1 -$9 (==重点==) 位置参数变量。如: /etc/init.d/sshd restart 这个restart就是对应$1
${10}-${n} 扩展位置参数变量, 第10个位置变量必须用{}大括号括起来(了解即可,几乎用不到)
$# 脚本后面接的参数的个数
$*$@ 脚本后面所有参数
 
 

      Bash shell 算术运算的方式:

  1. 使用$[ ] (==建议主用这种就可以了,其它可以看懂即可==)
  2. 使用 $(( ))
  3. 使用expr外部程式
  4. 使用let命令
  5. 借助bc命令

        命令:wc

                                           统计命令

参数说明
-l 统计行数
-c 查文件所有行有多少字符(换行符也算一个字符)
-m 查文件所有行有多少字符(换行符也算一个字符)
-L 查文件最长的行有多少字符(换行符不算字符) ==可用于计算单行长度==
 
           

        命令:cut

                                      截取命令,特点:只能以单个字符为分隔符。后面讲awk和sed在截取的很多方面比cut更有优势.

参数说明
-d 指定分隔符
-f 指定第几列
-c 截取第几个字符
             

  命令:sort

          排序命令

参数说明
-r 反向排序
-n 以数字来排
-f 大小写不敏感
-t 分隔符
-k 接数字代表第几列
       

           命令:uniq

                                    去重命令

参数说明
-c 去重后统计
   
       

   命令:grep

                                     行查找命令(后面讲正则表达式会重点使用)

参数说明
-n 显示行号
-v 反向查找
-i 大小写不敏感
-E或egrep 扩展模式
-o 把查出的关键字全显示出来,方便统计次数
-f 适合查找两个文件重复的行
-A 后接数字n,表示可以查找的那行还会显示下面的n行
 
 
 练习:
对有下面内容的文件进行操作
# cat 1.txt
http://a.domain.com/1.html
http://b.domain.com/1.html
http://c.domain.com/1.html
http://a.domain.com/2.html
http://a.domain.com/3.html
http://b.domain.com/3.html
http://c.domain.com/2.html
http://c.domain.com/3.html
http://a.domain.com/1.html
得到下面的结果
	4 a.domain.com
	3 c.domain.com
	2 b.domain.com

比较死板的命令可以得到上面的结果:
cat 1.txt | cut -c8-19 | sort -f | uniq -c | sort -k1 -r





                 与文件有关的判断

语法格式

  • 格式1: ==test== 条件表达式
  • 格式2: [ 条件表达式 ]
  • 格式3: [[ 条件表达式 ]] 支持正则 =~

判断参数说明
-e (常用) exist 判断文件(任何类型文件)是否存在
-f (常用) file 判断是否为普通文件
-d (常用) directory 判断是否为目录
-S 判断是否为socket文件
-p 判断是否为pipe管道文件
-c 判断是否为character字符设备文件
-b 判断是否为block块设备
-L link 判断是否为软链接
-s 判断文件是否存在并且为非空文件
 
 示例:
[ ! -d /etc ]					判断目录是否存在,不存在条件为真  (中括号里面左边两边有空格)
[[ -f /etc/fstab ]]				判断文件是否存在,并且是普通文件 (中括号里面左边两边有空格)
 
                     

文件权限相关的判断

判断参数说明
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid(权限9位的前3位里是否有s位)
-g 是否sgid(权限9位的中间3位里是否有s位)
-k 是否有t位(权限9位的后3位里是否有t位)
 
 

两个文件的比较判断

判断表达式说明
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
 
 

整数之间的判断

判断参数说明
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
 

字符串之间的判断

判断参数或表达式说明
-z 是否为空字符串,字符串长度为0则为真
-n 是否为非空字符串,只要字符串非空则为真
string1 = string2 两个字符串是否相等
string1 != string2 两个字符串是否不等

 

 

多重条件判断

判断参数 
条件1 -a 条件2 (and) 条件1 && 条件2 两个条件同时满足,整个大条件为真
条件1 -o 条件2 (or) 条件1 || 条件2 两个条件满足任意一个,整个大条件为真

示例:

[ 1 -eq 1 -a 1 -ne 0 ]				整个表达式为真
[ 1 -eq 1 ] && [ 1 -ne 0 ]
 
[ 1 -eq 1 -o 1 -ne 1 ]				整个表达式为真
[ 1 -eq 1 ] || [ 1 -ne 1 ]

 

 

使用&&与||符号实现判断语句

符号说明
; 不管前面执行是否正确,都会执行后面
&& 前面执行正确,才会执行后面
|| 前面执行失败,才会执行后面
条件 && 动作			 # 前面条件满足则执行动作
条件 || 动作        	 # 前面条件失败则执行动作
条件 && 动作1 || 动作2    # 如果条件满足,则执行动作1,否则则执行动作2

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

posted on 2023-11-27 16:25  JPGer  阅读(9)  评论(0)    收藏  举报

导航