Shell脚本

  • 一、脚本的建立和运行
  • 二、Shell程序的参数位置
  • 三、基本语法
  • 四、常见操作


shell是用户和系统内核交互的程序。我们经常使用的shell是bash。下面简单的复习一下bash脚本的使用。

一、脚本的建立和运行

bash脚本常见的有两种运行方式:一种是输入命令让bash交互的执行它们,另一种就是将命令写入到文件中,然后将文件作为程序来调用。

流程如下:

1.创建shell脚本 2.赋予文件可执行权限(chomd +x shell.sh) 3.运行程序(./shell.sh)

二、Shell程序的参数位置

位置参数:

位置参数是由系统提供的参数。可以用$N来表示,N是一个数字。$0表示脚本文件的名字,$1-$9表示命令行参数1-9的值。另外常用的还有: $*代表命令行中所有参数,$#代表命令行参数的个数。

三、基本语法

  1. 变量

可以分环境变量和用户自定义变量。常见的环境变量如下:

环境变量

说明

$HOME

当前用户的主目录

$PATH

以冒号分隔的用来搜索命令的目录列表

$IFS

内部域分割符,用来分割shell读取的输入,一般是空格,制表符和换行符

自定义变量

可以不声明变量的类型,这样默认是字符类型。也可以用declare来声明变量的类型,语法如下:

declare [option] [name[=value]] 其中常用的options选项如下:

options

说明

-a

声明一个数组

-f

声明一个函数

-i

声明一个整数

-r

声明为只读变量

变量的赋值:直接用等号来赋值,注意等号两边没有空格

变量的引用:在变量名前面加上**$**符号就可以得到变量的值

命令替换:利用方式为$(command)或者command用反引号包裹。例子:

echo $(pwd) 
echo `pwd`
  1. 语句

条件语句:给出一个例子,读入一个字符串,如果是目录列出目录下的信息,如果是文件,读出文件的内容

!#/bin/sh
echo "please enter a directory or file name"
read a  #读入一个变量a
if [ -d $a ] #注意if后面的表达式,左中括号([)后面和右中括号前面(])要有空格,-d表示是否为目录
then  #后面要紧接着then
	ls $a
elif [ -f $a ] #-f表示是否是文件
then
	cat $a
else 
	echo "input error"
fi #最后要用fi结尾

条件判断除了用if,还可以test命令。常见的条件类型有三类:字符串比较算数比较与文件有关的测试

字符串比较

结果

string1 = string2

两个字符串相同则返回真

string1 != string2

两个字符串不相同则为真

-n string

string不为空则为真

-z string

string为空则为真

算数比较

结果

exp1 -eq exp2

两个表达式相等则结果为真

exp1 -gt exp2

exp1 大于 exp2则为真

exp1 -ge exp2

exp1 大于等于 exp2则为真

! exp

取反

文件测试条件

说明

-d file

file 是目录则为真

-f file

file为文件则为真

-e file

file存在则为真

-s file

如果文件长度不为0则为真

循环语句

常用的就是for语句和while语句,格式如下:

#for语句 遍历
for x [in list]
do
command-list
done

#while语句
while expression
do
command-list
done

四、常见操作

  1. 字符串截取
#截取一个字符串的子串,常见的操作如下
#从指定位置开始截取
#1)从字符串左边开始计数。用法: ${string:start:length},下标从0开始,截取长度为length的串
str="abcdefg"
echo ${str:0:3}  #结果为abc
#2)从字符串右边开始计数。用法: ${string:0-start:length},起始数字为1。截取方向也是从左向右
echo ${str:0-4:3} #结果def

#从指定字符开始截取 
#${string#*chars}:从string左边开始截取第一次出现chars字符的右边的串
str="abcadefg"
echo ${str#*a}  #结果bcadefg
#${string##*chars}:从string左边开始截取最后一次出现的chars字符的右边的串
echo ${str##*a} #结果defg

#使用%截取自定字符左边的串 ${string%chars*}
str="abcbfg"
echo ${str%b*}#结果abc
echo ${str%%b*}#结果a

2.cut命令

cut 命令是一个选取命令,是按照行来选取指定的信息。常见的用法如下:

cut [-bn] [file]

cut [-c] [file]

cut [-df] [file]

  • 第一,字节(bytes),用选项-b
  • 第二,字符(characters),用选项-c
  • 第三,域(fields),用选项-f

若没有指定文件,可将标准输入作为数据内容

#例子	
more 1.txt 
abc:defg
abcd:efgh
abcde:fghijk

cut -b 1-2 1.txt #取每行的第1,2个字节。也可以用逗号隔开
#结果
ab
ab
ab

more 2.txt
你好世界
测试数据

cut -c 1-3 2.txt #这里主要用于取到多字节的数据,例如中文 (你和测占了3个字节)
#结果
你
测

#cut默认的分割符为制表符,可以用-d来指定分隔符,配合-f指定提取的域
more /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin

#比如要提取用户名,观察文本特征是用冒号来分割的
cat /etc/passwd | cut -d : -f 1
#结果
root
daemon
bin
sys

参考文章:
1.Linux字符截取命令-cut2.Shell字符串截取(非常详细)