Shell入门

Shell概述

Shell入门_第1张图片
linux系统常见的命令行解释器有许多,常用的是sh和bash,其实sh是bash的一个软链接,还是调用的bash。
Shell入门_第2张图片

Shell脚本入门

脚本以#!/bin/bash开头,指定命令行解释器为bash。

输出hello world

创建一个helloworld.sh,内容如下:

#!/bin/bash
echo 'hello world'

执行脚本

bash helloworld.sh

Shell中的变量

系统变量

常用的系统变量:

$HOME: 当前系统用户目录
$PWD: 当前工作目录的绝对路径
$SHELL: 当前使用的Shell解释器
$USER: 当前用户名

自定义变量

NAME=John # 变量定义:变量=值, 注意等号前后不能有空格
echo $NAME # 输出变量值
unset NAME # 撤销变量
变量定义规则
  • 变量名可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
  • 等号两侧不能有空格
  • 在bash中,变量默认类型都是字符串类型,无法进行数值运算
  • 变量的值如果有空格,需要使用双引号或者单引号括起来
  • 使用可将局部变量提升为全局变量,供其他Shell程序使用。

特殊变量

$n: n为数字,$0为脚本名,$1为脚本第一个参数,$2为脚本第二个参数...,第10及以上个参数访问需加大括号${10}
$#: 获得脚本参数的个数,常用于循环
$*: 获取所有参数,将所有参数看成一个整体 ??
$@: 获取所有参数,将参数区分开来
$?: 返回最后一次执行的命令的状态,如果为0表示上条命令执行成功

运算符

$((运算式)) 或 $[运算式]
expr +,-,*,/,% 加减乘除取余
expr运算符间要有空格

s=$[(2+3)*4]
echo $s # 输出20

expr 2 + 3 # 此种形式运算符前后必须要有空格

在这里插入图片描述

条件判断

语法

[ condition ]:condition前后要有空格,condition非空即返回true,[]返回false

常用的判断条件

两个整数之间比较
符号 描述
-lt (less than)小于
-le (less equal) 小于等于
-eq (equal)等于
-gt (greater than) 大于
-ge (greater equal) 大于等于
-ne (not equal) 不等于

文件权限判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
文件类型判断
-f 文件存在并且是一个常规文件
-e 文件存在
-d 文件存在并是一个目录

判断23是否大于2

[linux@localhost datas]$ [ 23 -gt 2 ]
[linux@localhost datas]$ echo $?
0

判断helloworld.sh是否有写入权限

[linux@localhost datas]$ [ -w helloworld.sh ]
[linux@localhost datas]$ echo $?
1

判断目录中文件是否存在

[linux@localhost datas]$ [ -e /home/linux/datas ]
[linux@localhost datas]$ echo $?
0

多条件判断

[ condition1 ] && [ condition2 ]: condition1执行成功才执行condition2
[ condition1 ] || [ condition2 ]: condition1执行失败才执行condition2

流程控制

基本语法

if [ 条件判断式1 ];then
	程序
elif [ 条件判断式2 ];then
	程序
fiif [ 条件判断式1 ]
	then
		程序
elif [ 条件判断式2 ]
	then
		程序
fi

注:

  • if后要有空格

case语句

case $变量名 in
"值1") # 实际代码中不要加“”,shell中变量类型默认是字符串
	程序1
;;
"值2")
	程序2
;;
*)
	其它
;;
esac

for循环

for((初始值; 循环控制条件; 变量变化))
do
	程序
donefor 变量名 in 参数1 参数2 参数3
do
	程序
done
举例
#求和
s=0
for((i=0; i<=100; i++))
do
	s=$[$s+$i]
done
echo $s

#打印所有的输入参数
for i in $*
do
	echo $i
done

while循环

while [ condition ]
do
	程序
done

注:

  • while后要有空格

read读取控制台输入

语法
read(选项)(参数)
选项:
-p: 指定读取值时的提示符
-t: 指定读取值时的等待时间
参数:
变量: 指定读取值时的变量名
举例
# 提示7s内读取控制台输入的名称
read -p "input your name" -t 7 NAME
echo $NAME

函数

系统函数

basename

basename [文件路径/文件名] [后缀]
提取文件名,如果指定后缀,会将文件名的后缀去掉

basename /home/gh/test.txt .txt # 返回test
basename /home/gh/test.txt # 返回test.txt
dirname

返回文件的绝对路径,从给定的包含绝对路径的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录部分)

dirname /hone/gh/test.txt # 返回/home/gh

自定义函数

function sum()
{
	s=0
	s=$[$1+$2] # $1表示函数sum接收的第一个参数
	echo $s
}
read -p "请输入第一个参数:" P1
read -p "请输入第二个参数:" P2
sum $P1 $P2 # 由于shell脚本是逐行运行,函数必须先定义再调用

Shell 工具

cut

cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出
cut [选项参数] filename

-f 列号,提取第几列
-d 分隔符,按照指定分隔符分隔列

举例
[linux@localhost datas]$ cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[linux@localhost datas]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le

# 获取第三行第一个单词
[linux@localhost datas]$ cat cut.txt | grep guan | cut -d " " -f 1
guan

sed

sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”,接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,文件内容并没有改变,除非你使用重定向存储输出。

基本用法

sed [选项参数] ‘command’ filename
选项参数说明:

  • -e: 直接在指令列模式上进行sed的动作编辑,一般sed后面跟多条命令的时候需要在每条命令前加-e,如果只有一条命令则可以省略。
  • -i: 直接编辑原始文件

命令功能描述
a 新增
d 删除
s 查找并替换

举例
# 将test插入test.txt的第二行
sed -i "2a test" test.txt

# 删除test.txt中所有包含wo的行
sed "/wo/d" test.txt # 增加在前删除在后

# 将test.txt文件中的wo替换成ni
sed "s/wo/ni/g" # g表示全局替换,如果不加g则只替换第一个

# 将test.txt文件中的第二行删除并将wo替换成ni
sed -e "2d" -e "s/wo/ni/g" test.txt

awk

awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理

基本用法

awk [选项参数] ‘pattern1 {action1} pattern2{action2}…’ filename
选项参数:
-F 指定输入文件分隔符
-v 赋值一个用户定义变量

shell中的括号

(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。
(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。
(3)$((expression))`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。

你可能感兴趣的:(ubuntu,bash,linux,开发语言)