一些文章:
便捷的vim操作:
vi、vim操作
取消高亮显示:
命令行下,:noh
#取消高亮,有时候将某个地方高亮显示了,看着不舒服,在命令行模式下使用
调整文本格式:
命令行下,键v以后,用上下左右键将需要调整的文本选中,再+加号即可
#将文本按正常格式重新排列
一、shell基础
1、什么是shell?
Shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序。
用户可以用Shell来启动、挂起、停止、编程等操作。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell还是一个功能强大的编程语言、编写方面、调试方便、灵活性强。
Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
2、linux默认Shell?
/bin/bash
3、查看当前系统的shell
查看当前系统有哪些shell
cat /etc/shells
查看当前是什么shell
echo $SHELL
4、权限相关命令 chmod
linux分为:
超级用户(根目录、安装软件)
普通用户
修改文件权限:
rwxrwxrwx
文件所有者、组用户、其他用户
字母法:chmod (u g o a)(+ - =)(r w x)(文件名)
数字法:chmod + 数字组合 + 文件名
(u g o a): 这部分指定权限适用的对象
u 代表文件所有者的权限
g 代表与文件所有者同组的用户的权限
o 代表其他所有用户的权限
a 代表所有用户,包括文件所有者、组用户和其他用户
(+ - =): 这部分指定权限的操作
+ 代表添加权限
- 代表移除权限
= 代表设置确切的权限,覆盖之前的权限
(r w x): 这部分指定具体的权限
r 代表读权限(read)
w 代表写权限(write)
x 代表执行权限(execute)
数字组合:采用八进制
777:111 111 111
(文件所有者、组用户、其他用户:都有读、写、执行权限)
666:110 110 110
(文件所有者、组用户、其他用户:都有读、写权限)
444:100 100 100
(文件所有者、组用户、其他用户:都有读权限)
222:010 010 010
(文件所有者、组用户、其他用户:都有写权限)
111:001 001 001
(文件所有者、组用户、其他用户:都有执行权限)
5、基本命令
pwd
ls
cd
mkdir
rmdir
cp
mv
touch
clear
man
data - 打印或设置系统日期和时间
date +%T 24/03/22
date +%Y/%m/%d 2024/03/22
date +%H:%M 15:16
date +"当前时间为:%Y/%m/%d %H:%M:%S" 当前时间为:2024/03/22 15:15:35
date +"三个月之后:%Y/%m/%d %H:%M:%S" -d "+3 month" 三个月之后:2024/06/22 15:16:19
date +"三天前:%Y/%m/%d %H:%M:%S" -d "-3 day" 三天前:2024/03/19 15:16:24
date -s "20300111 19:43:44" 设置日期
6、输入输出相关 echo > <
输出命令:
echo 将字符串回显到标准输出
linux@linux:~$ echo hello
hello
输入输出重定向:
1、什么是重定向?
改变shell命令或程序默认的标准输入/输出目标,重新定向到新的目标
2、默认的输入输出位置是哪里?
linux中默认的标准输入定义为键盘,标准输出定义为终端窗口
标准输入:(stdin,文件描述符为0):默认从键盘输入
标准输出:(stdout,文件描述符为1):默认输出到屏幕。
标准出错:(stderr,文件描述符为2):默认输出到屏幕。
3、什么要使用重定向?
<1>当屏幕输出的信息很重要时,而且希望保存重要的信息时
<2>后台执行中的程序,不希望它干扰屏幕正常的输出结果时
<3>系统的例行命令,例如定时任务的执行结果,希望他可以存下来
<4>一些执行命令,我们已经知道他可能出现错误信息,想把它直接丢掉时
<5>执行一个命令,可能报错和正确的输出并序,类似错误日志与标准正确日志需要分别输出至不同的文件。
输入重定向:
输入重定向符 | 含义 | 实例 |
<file | 将file文件重定向为输入源 | wc<file,将file中的内容作为输入传给wc命令 |
<<分界符 | 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串 | cat<<9,当遇到输入9时,输入结束 |
命令<文件1>文件2 | 将文件 1 作为命令的输入设备,该命令的执行结果输出到文件 2 中。 | cat<file<log,file作为cat命令的输入,把cat的输出结果输出到log文件中 |
7、通配符 * ? [ ]
通配符是一种特殊语句,通配符是用来代替字符的
linux@ubuntu:~/mywork$ ls file_*.txt
file_liu.txt file_wang.txt file_lee.txt file_song.txt
linux@ubuntu:~/mywork$ ls file_?.txt
file_1.txt file_2.txt file_3.txt file_4.txt file_5.txt
linux@ubuntu:~/mywork$ ls file_[1-5].txt
file_1.txt file_2.txt file_3.txt file_4.txt file_5.txt
linuxx@ubuntu:~/mywork$ ls file_[^245].txt
file_1.txt file_3.txt
通配符 | 含义 | 实例 |
星号* | 匹配任意长度的字符串 | 用file_*.txt,匹配file_wang.txt、file_Lee.txt、file3_Liu.txt |
问号? | 匹配一个长度的字符 | 用flie_?.txt,匹配file_1.txt、file1_2.txt、file_3.txt |
方括号[...] | 匹配其中指定的一个字符 | 用file_[otr].txt,匹配file_o.txt、file_r.txt和file_t.txt |
方括号[ - ] | 匹配指定的一个字符范围 | 用file_[a-z].txt,匹配file_a.txt、file_b.txt,直到file_z.txt |
方括号[^...] | 除了其中指定的字符,均可匹配 | 用file_[^otr].txt,除了file_o.txt、file_r.txt和file_t.txt的其他文件 |
8、管道 |
管道可以把一系列命令连接起来,意味着第一个命令的输出将作为第二个命令的输入,
通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。
就像通过使用“|”符连成了一个管道。
9、历史查询 history
二、文件相关shell命令
1、查看文件 cat
cat 将文件信息显示在标准输出(屏幕)上
2、查找文件 find grep
find 在目录层次结构中搜索文件
find [起始目录] 寻找条件 操作
选项:
-name '字串'查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。
-iname '字串' 忽略大小写的方式查找
-type x 查找类型为 x 的文件
-exec 命令名称 {}
对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。
{}表示命令的参数即为所找到的文件;命令的末尾必须以“ \;”结束。
寻找条件:
-a 与
-o 或
! 非
寻找条件可以是一个用逻辑运算符 not、and、or 组成的复合条件
and:逻辑与,在命令中用 -a 表示,是系统缺省的选项,表示只有当所给的条件都满足时,寻找条件才算满足
find . -name 'tmp' -a -type c -a -user 'inin'
or:逻辑或,在命令中用 -o 表示。该运算符表示只要所给的条件中有一个满足时,寻找条件就算满足OPTIONS:描述命令所有的参数或选项
find . -name 'tmp' -o -name 'mina*'
not:逻辑非,在命令中用 ! 表示。该运算符表示查找不满足所给条件的文件
find . ! -name 'tmp'
grep 查找文件内容命令
grep [选项] 要查找的内容 查找的位置
选项:
-A 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-B 除了显示符合样式的那一行之外,并显示该行之前的内容。
-C 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-i 忽略字符大小写的差别。
-r 查找位置是目录时用。
-n 在显示符合样式的那一行之前,标示出该行的列数编号。
which
whereis
3、解压缩文件 tar
tar
tar命令主要用于将若干文件或目录合并为一个文件,以便备份和压缩。
语法格式:
tar [ -t | -x | -r | -c | -v | -f | -j | -z ] tarfile filelist
-t 显示归档文件的内容
-x 释放归档文件
-c 创建一个新的归档文件
-r 追加的方式归档文件
-v 显示归档和释放的过程信息
-f 用户指定归档文件的文件名,否则使用默认名称
-j 由tar生成归档,然后由bzip2压缩
-z 由tar生成归档,然后由gzip压缩
示例:
tar -cvf file1.tar file1
创建归档文件,显示归档过程信息,压缩后为file.tar
tar -xvf file.tar
解压缩文件,显示解压过程信息,操作file.tar文件
三、进程相关shell命令
1、ps
语法
ps [options]
常用语法:
ps -elf
ps -aux
-e: 显示所有进程。
-l: 使用长格式显示进程信息。这会提供比默认格式更多的列。
-f: 使用完整的格式显示进程信息。
这包括UID(用户ID)、PID(进程ID)、PPID(父进程ID)、C(CPU利用率)、
STIME(开始时间)、TTY(控制终端)、TIME(CPU时间)、CMD(启动命令)等字段。
-a: 显示所有用户的进程,而不仅仅是当前用户的进程。
-u: 显示进程的详细用户信息。
-x: 显示没有控制终端的进程。
![](https://i-blog.csdnimg.cn/blog_migrate/7d0726d69e95e7c12785598d1af6b6f4.png)
2、top
监视进程:
通常会全屏显示,而且会随着进程状态的变化不断更新
整个系统的信息也会显示,为查找问题提供了便利
可以显示系统总共有多少CPU和内存资源以及负载平衡等信息。
3、pstree
将所有行程以树状图显示, 树状图将会以 pid (如果有指定)
或是以init这个基本进程为根,如果有指定使用者id, 则树状图会只显示该使用者所拥有的进程。
4、发送信号 kill
使用kill命令终止进程:
kill [-signal] PID
signal是信号
PID是进程号
示例:
kill -9 PID
结束PID这个进程
kill -l(小L)
查看可以发送哪些信号
5、用户管理
1、用户属性:
用户名
口令
用户ID(UID)
用户主目录(HOME)
用户shell
2、/etc/passwd文件:
/etc/passwd文件是系统能够识别的用户清单,用户登陆时,系统查询这个文件,确定用户的UID并验证用户口令
登陆名
经过加密的口令
UID
默认的GID
个人信息
主目录
登陆shell
3、/etc/group文件
包含了UNIX组的名称和每个组中成员列表,每一行代表一个组,包括4个字段
组名
加密的口令
GID号
成员列表,彼此用逗号隔开
4、添加用户
语法:adduser <username>
示例:
#adduser newuser --添加用户名为newuser的新用户
5、设置初始口令
语法:passwd [-k][-l][-u][-f][-d][-S] username
示例:passwd u
passwd可以修改用户命令
root用户可以修改任何用户的命令
6、设置用户属性
语法:usermod [-u uid [-o]] [-g group] [-G gropup,…]
[-d home [-m]] [-s shell] [-c comment]
[-l new_name] [-f inactive][-e expire]
[-p passwd] [-L|-U] name
举例用户oldname改名为newname,注意要同时更改家目录:
usermod –d /home/newname –m –l newname oldname
7、删除用户
语法:deluser <username>
示例:deluser --remove-home user1
删除用户user1的同时删除用户的工作目录
四、shell脚本
1、概述
Shell脚本是利用shell的功能所写的一个程序。
这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能
2、执行方式
新建.sh文件 --shell脚本
vi test.sh
文件内容:
#!/bin/bash
echo "hello world"
执行方式:
bash test.sh
source test.sh
./test.sh
输出结果:
hello world
3、shell脚本变量
变量:
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
变量可以通过变量名访问。在指令式语言中,变量通常是可变的。
变量作用:
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
命名规则:
变量分类:
用户自定义变量
1、在shell编程中通常使用全大写变量,方便识别
$ COUNT=1 #注意:'='两边不允许加空格
2、变量的调用:在变量前加$
$ echo $COUNT
1
3、Linux Shell/bash从右向左赋值
$ Y=y
$ X=$Y
$ echo $X
y
4、使用unset命令删除变量的赋值
$ Z=hello
$ echo $Z
hello
$ unset Z
$ echo $Z
5、取值
双引号: 允许通过$符号引用其他变量值
弱引用,其中的变量引用会被替换为变量值
单引号: 禁止引用其他变量值,$视为普通字符
强引用,其中的变量引用不会被替换为变量值,而保持源字符串
反撇号: 命令替换,提取命令执行后的输出结果,``和$(…)作用相同
示例:
echo "$COUNT"
echo '$COUNT'
A=$(echo $COUNT)
A=`echo $COUNT` #命令替换,提取出echo的输出结果,赋给变量A
1
$COUNT
1
1
6、数组
echo $a 默认显示数组a的第一个元素
echo ${a[0]} 显示数组中第一个元素,以此类推
echo ${a[-1]} 显示数组中最后一个元素
echo ${a[*]}、echo ${a[@]} 显示数组中所有元素
echo ${#a[@]} 显示数组中元素的个数
echo ${a[@]:起始元素id:元素个数]}
显示数组中以起始元素为首的指定个数的元素(注意:这里起始元素id不能为负值
unset a[n] 删除数组中的第n个元素
unset a 删除a这个数组
示例:
a=(1 2 3 4 5)
echo $a #第一个元素 1
echo ${a[*]} #所有元素 1 2 3 4 5
echo ${a[@]} #所有元素 1 2 3 4 5
echo ${#a[@]} #元素个数 5
echo ${a[2]} #下标为2的元素 3
echo ${a[@]:1:3} #打印下标为1-3的数据元素 2 3 4
unset a[2] #删除下标为2的元素后:
echo ${#a[@]} #元素个数 4
echo ${a[*]} #所有元素 1 2 4 5
7、只读变量
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启
readonly
示例:
readonly COUNT=3
#COUNT=5 #只读变量不能被改变
#unset COUNT #只读变量的赋值不能被删除
echo COUNT
8、位置变量、预定义变量
$0 与键入的命令行一样,包含脚本文件名
$1,$2,……$9 ${10} 分别包含第一个到第十个命令行参数
$# 包含命令行参数的个数
$@ 包含所有命令行参数:“$1,$2,……$9”
$* 包含所有命令行参数,是一个整体:“$1,$2,……$9”
$? 包含前一个命令的退出状态
$$ 包含正在执行进程的ID号
示例:
echo $0
echo $1
echo $2
./test.sh 1 2 3 #输出:./test.sh 1 2
echo $# #输出:3,命令行参数个数
echo $@ #输出:1 2 3
echo $* #输出:1 2 3
echo $?
echo $$ #2970 进程ID
9、环境变量
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
export可以将变量指定为全局变量
示例:
echo $PATH #输出路径
echo $USER #输出用户
4、shell语句
1、shell程序
Shell 程序由零或多条shell语句构成。 shell语句包括三类:
说明性语句
功能性语句
结构性语句
2、说明性语句(注释行)
以#号开始到该行结束,不被解释执行,注释行可以出现在程序中的任何位置,既可以单独占用一行,也可以接在执行语句的后面。
以#号开始到所在行的行尾部分,都不被解释执行. 例如:
#! /bin/sh
#
# 本程序说明
#
command_1
command_2 # command_2的语句说明
……
# 下面程序段的说明
command_m
……
command_n # command_n语句的说明
……
3、功能性语句(命令)
read:
read从标准输入读入一行, 并赋值给后面的变量,其语法为:
read var --把读入的数据全部赋给var
read var1 var2 var3 --把读入行中的第一个单词(word)赋给var1,
--第二个单词赋给var2, ……把其余所有的词赋给最后一个变量。
如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。
常用选项:
-s 输入不回显
-t 指定输入的时间
-p 指定输入的提示字符串
示例:
read -s -t 3 -p "please input two num:"
echo "val1 = $val1"
echo "val2 = $val2"
expr:
算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。
示例:
$ expr 12 + 5 \* 3
27
$ expr 3 - 8 / 2
-1
$ num = 9
$ sum=`expr $num \* 6 ` #要用取值符号``
$ echo $sum
54
test语句可测试三种对象:
字符串 整数 文件属性
每种测试对象都有若干测试操作符
字符串测试:
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
示例:
val1="hello"
val2="hello"
val3="hell"
val4=
test "$val1" = "$val2" #条件为真,输出0
echo $?
test "$val1" != "$val3" #条件为真,输出0
echo $?
test -z "$val4" #条件为真,输出0
echo $?
test -n "$val1" #条件为真,输出0
echo $?
整数测试:
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于b
示例:
val1=3
val2=5
test $val1 -eq $val2
echo $? #条件为假,输出1
test $val1 -lt $val2
echo $? #条件为真,输出0
文件测试:
-e name 测试一个文件是否存在
-d name 测试name 是否为一个目录
-f name 测试name 是否为普通文件
-L name 测试name 是否为符号链接
-r name 测试name 文件是否存在且为可读
-w name 测试name 文件是否存在且为可写
-x name 测试name 文件是否存在且为可执行
-s name 测试name 文件是否存在且其长度不为0
f1 -nt f2 测试文件f1 是否比文件f2 更新
f1 -ot f2 测试文件f1 是否比文件f2 更旧
示例:
test -f read.sh
echo $? #是普通文件,条件为真,输出0
4、结构性语句
结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:
条件测试语句(两路分支)
多路分支语句
循环语句
循环控制语句等
(1)分支语句
分支语句:
语法结构:
if 表达式
then 命令表
fi
如果表达式为真,则执行命令表中的命令;否则退出if语句, 即执行fi后面的语句。
if和fi是条件语句的语句括号,必须成对使用;命令表中的命令可以是一条,也可以是若干条。
示例1:
read -p "input a filename:" file #判断是文件还是文件夹
if [ -f $file ]
then
echo "$file is a file"
elif [ -d $file ]
then
echo "$file is a dir"
else
echo "$file is not a dir or file"
fi
示例2:
#判断用户是否存在,存在打印exist,不存在打印not exist
#^linux是正则表达式,即开头是linux
#wc -l统计文本行数,行数为1,说明找到了linux这个用户
#``是命令置换
#!/bin/bash
RET=`grep "^linux" /etc/passwd | wc -l`
if [ $RET -eq 1 ]
then
echo "exist"
else
echo "not exist"
fi
语法结构:
if 表达式
then 命令表1
else 命令表2
fi
**如果表达式为真,则执行命令表1中的命令,再退出if语句;否则执行命令表2中的语句, 再退出if语句。
**注意: 无论表达式是否为真,都有语句要执行。
示例:
read -p "input a filename:" file
if [ -e $file ]
then
echo "$file exist"
else
echo "$file is not exist"
fi
多路分支语句:
语法结构:
case 字符串变量 in
模式1)
命令表1
;;
模式2 | 模式3)
命令表2
;;
……
模式n)
命令表n
;;
esac
**多路分支语句case用于多重条件测试,语法结构清晰自然。
示例1:
#!/bin/bash
read -p "input yes/no" val
case $val in #判断输入是yes还是no
yes | y)
echo "input yes"
;;
YES | Y)
echo "input YES"
;;
no)
echo "input no"
;; #最后一个模式的双分号;;可以省略,前面不行
esac
示例2:
#学生成绩分级管理
#80-100 A
#60-79 B
#0-59 C
#-a 与
#-o 或
#! 非
#!/bin/bash
read -p "input score" val
if [ $val gt 100 -o $val lt 0] #shell下的判断方式-o
#if [ $val gt 100 ] || [ $val lt 0] #c下的判断方式||
then
echo "input error val"
exit
fi
val=`expr $val / 10`
case $val in
8 | 9 | 10)
echo "A"
;;
6 | 7)
echo "B"
;;
*)
echo "C"
;;
esac
(2)循环语句
for:
当循环次数已知或确定时,使用for循环语句来多次执行一条或一组命令。格式为:
for 变量名 in 单词表
do
命令表
done
<1>变量依次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令。
<2>循环次数由单词表中的单词数确定,命令表中的命令可以是一条,也可以是由分号或换行符分开的多条。
<3>如果单词表是命令行上的所有位置参数时,可以在for语句中省略 “in 单词表” 部分。
示例1:
#!/bin/bash
filename=`ls`
for file in $filename #循环判断ls列出来的名字是否是文件
do
if [ -f $file ]
then
echo "$file is a file"
else
echo "$file is not a file"
done
示例2:
#!/bin/bash #假设运行:./for.sh 1 2 3
#for file in "$@" #$@会输出 1 2 3 #表明这样是当作一个整体输出
for file in "$*" #$*会输出 1 #表明这样是一个一个的输出
do 2
echo "$file" 3
done
示例3:
#!/bin/bash
for ((i = 0; i < 5; i = i+1)) #c语言形式的for循环,运行时会循环打印i的值
do #注意:是(())双括号
echo "$i"
done
while:
while 命令或表达式
do
命令表
done
<1>while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,
然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
<2>while语句的退出状态为命令表中被执行的最后一条命令的退出状态。
示例:
#!/bin/bash #循环打印0 1 2 3 4
i=0
#while [ $i -lt 5 ] #[]中括号形式条件判断
while ((i < 5)) #也可以用c语言下的条件判断,注意要(())双括号
do
echo "$i"
i=`expr $i + 1`
done
循环控制语句:
break、continue
break n 跳出n层;
continue 语句则马上转到最近一层循环语句的下一轮循环上
continue n 转到最近n层循环语句的下一轮循环上
示例:
#!/bin/bash
i=0
while ((i < 5))
do
echo "$i"
if [ $i -eq 3]
then
break #break跳出本层循环
#continue #continue跳出本次循环
fi
i=`expr $i + 1`
done
#continue会跳出一次do循环,i加到3以后就会进入if条件判断,碰到continue就会跳出这次do循环,
#结果就是i的值一直会保持为3,打印完0 1 2后,一直打印3
#break会跳出一层do循环,i加到3以后就会进入if条件判断,碰到break后就会跳出do循环
#结果就是i的值为3时,就退出循环,仅会打印出0 1 2 3
5、函数
1、函数定义
基本语法:
function name() {
statements
[return value]
}
function是 Shell 中的关键字,专门用来定义函数
name是函数名
statements是函数要执行的代码,也就是一组语句
return value表示函数的返回值,其中return是Shell关键字,专门用在函数中返回一个值,这一部分可以写也可以不写。
示例:
fun.sh:
#*********************文件全部内容
#!/bin/bash
function fun(){
echo "hello world"
return 0
}
fun
#*********************
运行:
./fun.sh
hello world
2、函数调用
格式1:
value_name = `function_name [arg1 arg2...]`
#函数的所有标准输出都传递给了主程序的变量
格式2:
function_name [arg1 arg2...]
echo $?
#获取函数的返回的状态
示例:
fun.sh:
#*********************文件全部内容
#!/bin/bash
function fun(){
echo "hello world"
return 1
}
fun
echo $? #调用格式:获取函数的返回状态
#*********************
运行:
./fun.sh
hello world
1
fun.sh
#*********************文件全部内容
#!/bin/bash
function fun(){
echo "hello world"
grep "$1" /etc/passwd
echo $2
echo $3
echo $4
return 0
}
ret=`fun linux 1 5 8` #命令置换:是把标准输出的内容赋值给ret
echo "***$ret" #调用格式:所有标准输出都传递给了主程序的变量
#*********************
运行:
./fun.sh
***hello world
linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
1
5
8
3、变量作用域
全局作用域:在脚本的其他任何地方都能够访问该变量。默认是全局变量
局部作用域:只能在声明变量的作用域内访问。
声明局部变量的格式:
local variable_name =value
示例1:fun.sh
#!/bin/bash
function fun(){
val=100 #这里的变量默认是全局变量,函数外也能使用,想要变成局部变量,要加local
echo $val
return 1
}
fun
echo "***$val1"
运行:./fun.sh
100
***100
示例2:fun.sh
#!/bin/bash
function fun(){
local val=100 #加local后,变量变为局部变量,局部变量在函数外不能使用了
echo $val
return 1
}
fun
echo "***$val1"
运行:./fun.sh
100
***