前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux操作系统之Shell编程基础!

Linux操作系统之Shell编程基础!

原创
作者头像
用户5005176
修改2021-08-11 10:34:11
1.1K0
修改2021-08-11 10:34:11
举报
文章被收录于专栏:网站知识

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。同时,Bash 也是大多数Linux 系统默认的 Shell

基础使用

可执行文件的执行方式,注意文件开头#!/bin/bash

输出重定向

符号

说明

命令 > 文件

以覆盖的方式把命令的正确输出结果保存在文件中

命令 >> 文件

以追加的方式把命令的正确输出结果保存在文件中

命令 2> 文件

以覆盖的方式把命令输出的错误信息保存在文件中

命令 2>> 文件

以追加的方式把命令输出的错误信息保存在文件中

命令 &> 文件

以覆盖的方式把所有的信息保存在同一个文件中

命令 &>> 文件

以追加的方式把所有的信息保存在同一个文件中

命令 > 文件 2>&1

以覆盖的方式把所有的信息保存在同一个文件中

命令 >> 文件 2>&1

以追加的方式把所有的信息保存在同一个文件中

命令 >> 文件1 2>> 文件2

把正确信息追加到文件1 错误信息追加到文件2

代码语言:javascript
复制
ll > file  把ll命令正确的输出结果保存在file文件中
ll >> file  把ll命令正确的输出结果追加在file文件的最后
ll &>> file 把ll命令执行的所有结果追加在file文件的最后
ll &>> /dev/null 把ll命令的结果都舍弃 /dev/null相当于一个黑洞

输入重定向

统计文件中的字符数,分别是行数,单词数,字节数

代码语言:javascript
复制
wc < file

多命令顺序执行

格式

说明

命令1 ; 命令2

多个命令顺序执行,命令之间没有关联

命令1 && 命令2

命令1正确执行,命令2才会执行

命令1 || 命令2

命令1执行不正确,命令2才会执行

命令1 | 命令2

命令1的正确执行作为命令2的操作对象

代码语言:javascript
复制
cd / ; ll #进入根路径再执行ll
make && make install #只有make正确执行,才会执行make install
cd /test || echo 'not find'
ll | grep test

常用符号

通配符

说明

?

匹配一个任意字符

*

匹配任意内容

[]

匹配括号中的任意一个字符 例如:[a,b],匹配a或b其中一个字符

[-]

匹配一个范围内的一个字符 例如:[a-z],匹配a到z其中一个字符

[^]

匹配一个非括号内的字符 例如:[^0-9],匹配不是0到9的字符

代码语言:javascript
复制
rm -rf /*  删除所有文件 跑路必备
find -name *.rc? 

符号

说明

' '

单引号 在单引号中的特殊符号没有特殊意义

" "

双引号 在双引号中的特殊符号有特殊意义

``

反引号 用于执行系统命令

$()

也是用于执行系统命令

$

调用变量

#

注释

\

转义字符

代码语言:javascript
复制
x=1
echo '$x'  没有特殊意义
#$x 
echo "$x"  拥有特殊意义
#1

time = `date` 执行系统命令
time = $(date) 同样是执行系统命令
echo time 输出对应时间

read 读取键盘输入的值

read命令从键盘读取变量的值然后保存在指定变量,通常用在shell脚本中与用户进行交互的场合。

选项

说明

-p

指定读取值时的提示文字

-t

指定读取值时等待的时间(秒)

-n

设定输入的字符数

-s

隐藏输入信息

代码语言:javascript
复制
#!/bin/bash
read -p "输入密码:" -s pwd
echo $pwd

数值运算

可以使用$(())$[]进行数值的运算

代码语言:javascript
复制
sum=$(($1+$2))
sum=$[$1+$2]

变量置换

变量置换方式

变量y没有设置

变量y为空值

变量y设置值

x=${y-新值}

x= 新值

x 为空

x=$y

x=${y:-新值}

x= 新值

x= 新值

x=$y

x=${y+新值}

x 为空

x= 新值

x=新值

x=${y:+新值}

x 为空

x 为空

x=新值

x=${y=新值}

x= 新值

x 为空

x=$y

y= 新值

y 值不变

y值不变

x=${y:=新值}

x= 新值

X= 新值

x=$y

y= 新值

y= 新值

y值不变

x=${y?新值}

新值输出到标准错误输出(屏幕)

x 为空

x=$y

x=${y:?新值}

新值输出到标准错误输出

新值输出到标准错误输出

x=$y

变量

默认变量

变量

含义

$0

当前脚本名称

$1

脚本接收的第一个参数

$2

脚本接收的第二个参数

$#

脚本接收的所有参数个数

$@

脚本接收的所有参数

$*

脚本接收的所有参数 把所有变量当成一个整体

$?

前一行命令的执行状态

$$

显示当前进程的进程号

$!

显示后台最后一个进程号

代码语言:javascript
复制
bash test.sh a b c d  #bash执行文件
$0 ==>  default_var.sh
$1 ==>  a
$2 ==>  b
$# ==>  4
$@ ==>  a b c d
$* ==>  a b c d
$? ==>  0 #0代表正常执行

局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。调用变量要加$符号,注意等号左右不能有空格。

代码语言:javascript
复制
x=1
readonly x  定义只读变量
echo $x  #1
set 查看所有变量
unset 删除变量

环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。一般环境变量都是大写,便于区分。环境变量比如PATHHOME等。一般是在/etc/profile, 设置完成之后时候需要使用source /etc/profile使环境变量生效

代码语言:javascript
复制
export NAME=test 定义环境变量
env 查看环境变量
echo $PATH  查看环境变量
echo $HOME

declare 申明变量类型

选项

说明

-

可用来指定变量的属性

+

取消变量所设的属性

-i

将变量设置为整数型

-x

指定的变量会成为环境变量,可供shell以外的程序来使用

-p

显示指定变量的声明类型

代码语言:javascript
复制
declare - i sum=$1+$2

基础语法

echo 打印输出

代码语言:javascript
复制
echo test 直接打印出test
echo test > file 将打印内容写入文件

printf 格式化打印

格式替代符

说明

%ns

输出n个字符串

%ni

输出n个数字

%m.nf

输出浮点数 指代输出的整数位数和小数位数 例如%8.2f,代表共输出8位,其中2位小数,6位整数

序列

说明

\a

发出警告音

\b

后退

\f

换页(formfeed)

\n

换行

\r

回车(Carriage return)

\t

水平制表符

\v

垂直制表符

代码语言:javascript
复制
printf %s abcdef
#abcdef
printf "%s %s %s\n" a b c d e f g h i j
#a b c
#d e f

cut 提取列

选项

说明

-f

截取指定列

-d

-d:指定字段的分隔符,默认的字段分隔符为“TAB”;

代码语言:javascript
复制
cut -d ':' -f 1 /etc/passwd #以:为分隔截取第一列

test 条件判断

选项

说明

-e

判断文件是否存在

-d

如果文件为一个目录,则为真

-f

如果文件为一个普通文件,则为真

-L

判断文件是否存在,并且要为链接文件

-z

判断变量是否为空

-a

多重判断

-r

判断文件是否有读权限

-w

判断文件是否有写权限

-x

判断文件是否有执行权限

代码语言:javascript
复制
test -f file #判断文件是否为普通文件
[ -f file ] #另一种写法
echo $?  #查看上一条命令执行状态,0为正常执行

[ -f file ] && echo "文件存在" || echo "文件不存在"
[ -z "$name" ] && echo "变量为空" || echo "变量不为空"
[ "$x" == "$y"] && echo "两个变量相等" || echo "两个变量不相等"
[ -f file -a -w file ] #判断是否为普通文件并且是否具有写权限

流程控制

if 判断

代码语言:javascript
复制
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
   exit 1 #设置程序出口,停止执行下面语句
fi

#另一种写法
if [ $a == $b ]; then

fi

case 多选择判断

代码语言:javascript
复制
read -p "请输入数字" Num
case $Num in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

for循环

代码语言:javascript
复制
遍历数字
for num in 1 2 3
do
    echo "The value is: $num"
done

遍历字符串
for str in 'This is a string'
do
    echo $str
done

打印根目录所有文件
ls / > /root/file.log
for i in $(cat file.log)
do
echo $i
done

常规for循环
for ((i=0;i<10;i=i+1))
do
echo $i
done

while循环

代码语言:javascript
复制
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

代码语言:javascript
复制
int=1
until(( $int>=5 ))
do
    echo $int
    let "int++"
done

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 输入重定向
  • 多命令顺序执行
  • 常用符号
  • read 读取键盘输入的值
  • 数值运算
  • 变量置换
  • 变量
    • 默认变量
      • 局部变量
        • 环境变量
          • declare 申明变量类型
          • 基础语法
            • echo 打印输出
              • printf 格式化打印
                • cut 提取列
                  • test 条件判断
                  • 流程控制
                    • if 判断
                      • case 多选择判断
                        • for循环
                          • while循环
                            • until 循环
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档