泷羽Sec-kali Linux shell编程全(基础到进阶看这一篇文章就够了)

声明!
学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](https://space.bilibili.com/350329294)

在Linux系统中,shell编程是一项基本技能,它不仅能够提高系统操作效率,还能让你更好地理解和掌控Linux。本文将带领你从shell编程的基础入门,逐步进阶到复杂应用,通过改写和扩展原有内容,使内容更加丰富且保持低重复率。

目录

一、Shell编程基础

1. Shell简介

2.变量的使用

二、常见变量

1.方法一

​编辑

2.方法二

3.永久变量

4.字符串相关的操作

三、脚本程序传递参数

四、shell编程中进行数学运算

1.数学运算

2.混合运算

3.运算与变量结合

五、sell脚本与用户交互

1.用户交互

2.限制用户输入的字符个数

3.脚本模拟编写

4.关系运算符

六、字符串和逻辑运算符

1.字符串运算符

2.逻辑运算符之布尔运算符

3.余运算

七、if条件判断

1.if条件

2.for循环结构

3.for循环 例子

4.while循环

八、until循环(until 直到为止)

1.until循环

2.case 语句

3.基本函数学习

九、不同脚本的互相调用

1.互相调用

2.重定向


一、Shell编程基础

1. Shell简介

Shell是一种命令行界面,用于用户与操作系统进行交互。它也是一种脚本语言,允许用户编写程序自动执行一系列命令。Linux系统中常见的Shell类型包括bash、sh、dash等,其中bash是最常用的Shell之一。

1.1建立一个1.sh文件
vim 1.sh
可以利用 #! /bin/bash,#! /bin/dash,#! /bin/sh
这三种其实不管用哪种脚本解释器最后调用的还是这个dash
比如ls -l bin/sh 发现调用的还是dash
比如我们用 echo hello word 保存退出,运行一下 ./1.sh
就会输出 hello word (在复现的时候记得给予1.sh权限)
不然就会出现权限不足的情况 chmod u+x 1.sh

1.2我们新建一个 2.sh

vim 2.sh ,直接编辑模式输入 echo baidu.com
默认是没有权限的 但是我们利用 sh 2.sh
照样执行成功bash 2.sh 一样成功
我们执行脚本是在当前目录下执行的,如果你的脚本在别的目录
你就要去到那个目录,或者指定好对应路径

1.3
利用source 2.sh 执行和sh命令差不多
只不过这个命令就是对颜色加深标注了 比如我们重编辑一下这个文件
直接把ls命令放到2.sh里面去 sh 2.sh 可以看见直接输出了当前目录下的 2.sh颜色加深了
这个例子就是给大家说明一下这个shell脚本如何在这个里面进行一个执行

2.变量的使用

1.1 变量声明和定义
举例 定义一个name变量,name="wanhao"
再利用 echo $name 打印出来,这就是简单的变量声明
比如 age="27"   echo $age 打印出来的 27

我们来写复杂点,比如说 echo my name is $name,and my age is $age years old
然后就直接打印出了 姓名 和年纪

一般来说加双引号和不加效果是一样的
echo "my name is $name,and my age is $age years old"
加单引号效果是一样的
echo 'my name is $name,and my age is $age years old'
你会发现他并没有把变量赋值打印出来,而是直接把变量写进来了,
区别就是不加或者双引号可以输出变量,但是加入单引号他会把变量当字符串输出出来

1.2变量拼接
echo "my name is $name,and my age is $ageyears old"
这个例子中 years与age之间没有空格 所以打印出来为空
因为变量没有事先定义 所以为空
解决办法 将变量用双引号括起来它就会做一个区分
echo "my name is $name,and my age is "$age"years old"
那么除了""还能用什么呢 用{}也可以
echo "my name is $name,and my age is {$age}years old"

这样输出的变量会将输出内容利用花括号框起来
上面讲的全部是临时的一个变量,变量是由数字,字符串下划线组成,
但是不能以数字开头例如9name,这种是不行的,变量中间最好不要有空格 比如说wanhao 如果非要用这种可以加个下划线wan_hao="wanhao" 这种

我们怎么查看我们定义的变量呢比如说利用set命令,
比如说set | grep name,怎么删除变量呢我们使用 unset name
再次查看setgrep name就发现没有了

二、常见变量

echo $HOME(家目录 root用户)
/root
Windows中环境变量在path下添加
which --a ls (通过这个命令查看ls命令脚本所在路径)
再看看 echo $PATH 这么一个环境变量
usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sin:/bin:/usr/local/games:/usr/games
查看输出结果 存在/usr/bin 目录 就是当我们执行ls它会帮我们找到对应得目录做一个执行,也就是Is得完整路径应该是 /usr/bin/ls 脚本

1.方法一

根据刚刚的说法
那我们能不能把我们1.sh脚本:直接写到/usr/bin/目录下,然后在kali终端直接输出呢
就是把脚本直接放入已经定义好的路径当中去
mv 1.sh /usr/bin

2.方法二

那么我们也可以把/root/这个目录直接添加到环境变量中去让整个目录的文件都可以直接执行
export PATH=/root:PATH
echo $PATH (查看环境变量中root目录是否被添加)
export: 是一个用于设置环境变量的关键字,使得设置的变量可以在当前 shell 以及由该 shell 启动的子进程中生效。
PATH: 这是一个非常重要的环境变量,它定义了系统在哪些目录下去寻找可执行程序。当你在命令行输入一个命令(如ls、cat等)时,系统会根据PATH环境变量所指定的目录顺序去查找对应的可执行文件,找到后就执行它。
/root:PATH: 这里是在重新定义PATH的值。它将/root目录添加到了原有的PATH变量值的最前面(假设原有的PATH值存储在变量PATH中,这里通过:PATH的形式保留了原来的值并添加了新的部分)。这样做的结果是,当系统去查找可执行程序时,会先在/root目录下查找,然后再按照原来PATH所指定的其他目录顺序查找。

3.永久变量

刚刚的export只是设置了临时变量,那么我们只有把它写入到配置文件当中才能永久生效
usr/bin/vi .bashrc
source /usr/bin/ .bashrc
export PATH=/root:PATH

source (变量生效 或者重启生效)
新开一个窗口查看变量 1.sh 是否生效

4.字符串相关的操作

假设我们想知道一个字符串的长度,比如我们想解析一个字符串的长度我们如何进行实现?
比如 name="wanhao" age=27 然后我们通过echo"my name is$name,and i am $age years old" 打印完整字符串
str="hello word"
echo ${#tstr}

012 三个字符
echo ${str:0:3}

三、脚本程序传递参数

脚本如下:

echo 执行的文件名是: $0
echo 第一个参数是: $1
echo 传递的参数作为一个字符串显示: $*
echo 传递的参数独立作为每个字符串显示: $@
echo 传递到脚本的参数个数是: $#
echo 最后命令的退出状态: $?
echo 脚本运行的当前进程ID是: $$

可以向脚本程序传递一个或多个参数,脚本出的$1,里面的数字是可以依次递增的,比如$1,$2,$3等等,其中的$0(比较特殊表示文件名称)
那么好 我们利用vim 写入脚本3.sh,再利用sh 3.sh执行文件,我们看看执行结果:
执行的文件名是:3.sh
第一个参数是:
传递的参数作为一个字符串显示:
传递的参数独立作为每个字符串显示:
传递到脚本的参数个数是:0
最后命令的退出状态:0
上面显示第一个参数为空,因为我们没有给它指定任何一个参数,我们给他指定一个参数name,sh 3.sh name

然后第一个参数就为name
那么假设我们加入第二个,第三个参数,修改脚本
vim 3.sh
指定参数名分别为 sh 3.sh 1 2 3

由此得出 参数传递一般为
$n (n表示数字 可递增)
$* 就是将参数当作统一的字符串显示出来,
$@ 是将每个字符串当作独立的字符串显示,这也是$*和$@的区别
$# 代表参数的个数
$? 是查看命令执行状态的,如果显示为0,那么命令就是正常执行的,其他数字就是出错了
$$ 就是查看脚本当前进程id的

四、shell编程中进行数学运算

1.数学运算

shell编程在数学运算的时候是相当麻烦的,python中的数学运算可能很简单

在shell编程中 利用expr进行运算
expr 7+18 回显 7+18 那么该怎么运算呢 expr 7 + 18 这样写就行了 7(空格)+(空格)18
以上方法适用于加法减法
如果用乘法就会报错
expr 25 \* 6 (乘法是用\* python直接*就行了 要用\进行转义)
那么如果是除法就有两种方法 一种是 /取整数%取余数
expr 51 / 3
expr 63 % 4

2.混合运算

expr 5 + 6 \* 7 (shell会按照先乘除后加减运算)
expr ( 5 + 7 \) \* 2
如果有括号这样直接运算就会报错,括号也要进行转义
expr \( 5 + 7 \) \* 2

3.运算与变量结合

name=`expr 5 + 6`
echo $name

五、sell脚本与用户交互

1.用户交互

先进入bash
利用 read name age 指定变量信息 wanhao 21 然后我们利用
echo $name 来接收用户输入
echo $age    来接收用户输入
这个例子可能不清晰 我们利用 read -p "请输入您的姓名" name
输入: wanhao
echo $name (接收用户的输入)
我们在看个例子 read -t 10 -p "请输入您的姓名:" name
-t (指定时间)
(这个例子是讲如果我们用户10秒没有输入自动退出程序)
那么如果我们在10秒内输入了就会执行成功

2.限制用户输入的字符个数

read -n 3 -t 10 -p "请输入您的姓名:" name
-n (限制字符输入的数量为3)

3.脚本模拟编写

vim 1.sh
read -p "请输入您的姓名: " name
echo "您输入的姓名是:$name,请您确认! "

4.关系运算符

脚本环境中如何简单的做条件判断

vim 2.sh
首先定义两个变量,然后通过if条件判断来进行两个简单的条件判断 再接入关系运算符,
-eq (相等)
-lt (小于)
-gt (大于)
-ne (不等于)
else (反转)

只能对数值进行判断,无法对这个字符串进行判断

脚本如下:
num1=78
num2=89
if [ $num1 -eq $num2 ] ; then
    echo 相等
else
    echo 不相等
fi

[]可以换成 test进行测试
num1=78
num2=89
这两行代码分别定义了两个变量 num1 和 num2,并给它们赋予了初始值,num1 被赋值为 78,num2 被赋值为 89。

条件判断部分:
if [ $num1 -eq $num2 ];  这里使用 if 语句来进行条件判断。在 if 语句的条件表达式中,[] (注意实际使用时 [ 和它里面的内容、] 和它前面的内容都要有空格隔开,这里为了方便说明先按紧凑格式写) 在 shell脚本中用于进行各种测试操作。$num1 和 $num2 是对前面定义的两个变量 num1 和 num2 的引用,获取它们的值来参与条件判断。-eq 是一个比较操作符,用于判断两个值是否相等(在数值比较的语境下,这里就是判断 num1 的值和 num2 的值是否相等)。所以整个条件表达式就是在测试num1 的值和 num2 的值是否相等。

执行逻辑部分:
then: 如果前面的条件判断结果为真(即 num1 的值和num2 的值确实相等),那么就会执行 then 后面的代码块。
echo 相等: 当条件满足(也就是 num1 和 num2 相等)时,会执行这行代码,通过 echo 命令输出字符串 "相等"。
else: 如果前面的条件判断结果为假(即 num1 的值和num2 的值不相等),就会执行 else 后面的代码块。
echo 不相等: 当条件不满足(也就是 num1 和 num2 不相等)时,会执行这行代码,通过 echo 命令输出字符串 "不相等"。
总体来说,这段代码就是先定义了两个具有不同初始值的变量,然后通过条件判断来比较这两个变量的值是否相等,并根据判断结果输出相应的字符串("相等" 或者 "不相等")。

六、字符串和逻辑运算符

1.字符串运算符

首先我们在终端 利用vim 打开 1. sh

str1="hello"
str2="hello"
if [ "$str1" = "$str2" ]; then
         echo True
else
         echo false
fi

我们sh 1.sh运行脚本,再看看字符串是否相等,我们在并入
vim 1.sh  把hello,改成Hello 看看大小写是否敏感
sh 1.sh
ok不相等 ,所以在shell看来hello和Hello是两个不同的字符串代表shell大小写敏感


我们再插入 != 不等于试试看,返回true 说明他们不相等
str1="hello"
str2="Hello"
if [ "$str1" != "$str2" ]; then
         echo True
else
         echo flase
fi

-z  (检查字符串的长度是否为零)

str1="hello"
str2="hello”
if [ -z "$str1" ]; then
         echo True
else
         echo flase
fi

返回flase 长度不为零
-n  (检查字符串长度是否不为零)  与-z相反
我们再试试 空参数 不为空返回true,为空返回flase,我们把str1改为str11 看看是否为空

2.逻辑运算符之布尔运算符

num1=9
num2=19
if [ "$num1" != "9" ]; then
         echo num1不等于9
else
         echo num1等于9
fi

sh u.sh num1等于9

3.余运算

num1=9
num2=19
if [ "$num1" != "9" -a "$num2" -lt "20" ]; then
         echo true
else
         echo false
fi

同时满足"$num1" !="9" -a"$num2" -lt "20" 输出true 不满足返回flase
使用 -a 作为逻辑与运算符来正确连接两个条件,并给变量加上双引号确保保证正确
使用 -o 作为逻辑与运算符来正确连接两个条件,并给变量加上双引号确保保证正确

与之相反的参数是-o参数 只需要满足其中一个就可以返回true 两个都不满足就返回flase

七、if条件判断

1.if条件

vim 1.sh
#!/bin/bash

# 定义变量
a=10
b=20
# 进行条件判断
if [ "$a" -eq "$b" ]; then
         echo "a=b"
elif [ "$a" -gt "$b" ]; then
         echo "a>b"
else
         echo "没有符合上述条件"
fi

#定义变量
a=10
b=20
这部分代码定义了两个变量 a 和 b,并分别给它们赋了。在这里,a 被赋值为 10,b 被赋值为 20。在 bash脚本中,通过这种简单的 "变量名 = 值" 的形式就可以完成变量的定义和赋值操作。
进行条件判断
if [ "$a"-eq "$b" ]; then
         echo "a=b"
elif [ "$a"-gt "$b" ]; then
         echo "a>b"
else
         echo "没有符合上述条件"
fi
首先指
定使用 bash 作为脚本解释器,接着定义了两个变量 a 为 10、b为20,然后通过条件判断来比较 a 和 b 的值。
若 a 等于 b ,就输出 "a=b"
若 a 大于 b ,就输出 "a>b"

若前面两种情况都不成立,就输出 "没有符合上述条件"

进行条件判断
if ["$a"-eq "$b" ]; then
         echo "a=b"
elif ["$a"-gt "$b" ]; then
         echo "a>b"
elif ["$a"-lt "$b" ]; then
         echo "a<b"
else
         echo"没有符合上述条件"
fi

在原有的 if - elif - else 结构基础上,新增了一个elif 条件判断分支:
新增的条件判断语句为 elif ["$a"-lt "$b"]; then 其目的是判断变量 a 的值是否小于变量 b 的值。如果满足该条件就会执行后续的 echo "a<b" 语句,即在终端输出 "a<b"

2.for循环结构

方法一、首先新建一个 1.sh
vim 2. sh

for num in 1 2 3 4 5
do
         echo "The number is $num"
done

整体结构
这是一段使用 for 循环的代码片段,常见于 Shell 脚本(如 bash 脚本)中,用于对一系列的值进行迭代操作循环语句
for num in 1 2 3 4 5:
for: 是循环的关键字,用于开启一个 for 循环结构
num: 定义了一个循环变量,在每次循环迭代过程中,这个变量会被赋予不同的值。
in 1 2 3 4 5: 指定了一个值的列表,循环变量num 将会依次取这个列表中的每一个值。也就是说,在这个例子中,num 会先被赋值为 1,然后进行第一次循环;接着 num 会被赋值为 2,进行第二次循环,以此类推,直到 num 取完列表中的最后一个值 5。
循环体
do: 是与 for 循环起始语句配合使用的关键字,它标志着循环体的开始。在 do 和后面的 done 之间的语句就是每次循环时需要执行的操作。
输出语句
echo "The number is $num":
echo: 是一个用于在终端输出信息的命令
"The number is $num": 这是一个要输出的字符串,其中 $num 是对前面定义的循环变量 num 的引用。当循环进行时,每次 num 被赋予不同的值,这里就会输出不同的结果。例如,当 num 被赋值为1时,就会输出 "The number is 1";当 num 被赋值为 2 时,就会输出 "The number is 2" ,依此类推。
循环结束
done: 是for循环的结束关键字,它标志着整个 for 循环过程结束。

总体来说,这段代码的功能就是遍历给定的数字列表 1、2、3、4、5,并在每次遍历到一个数字时,通过 echo 命令输出包含该数字的字符串信息,如 "The number is 1" 、"The number is 2" 等

方法二、首先新建一个 1.sh

for str in "hello wold"
do
         echo $str
done

循环语句
for str in "hello wold":
for: 这是循环的关键字,用于启动一个 for 循环结构。
str: 定义了一个循环变量,在循环过程中,这个变量会被赋予不同的值。
"hello wold": 这里指定了一个值的列表,不过在这个例子中,列表里只有一个元素,就是字符串 "hello wold"。所以在整个循环过程中,循环变量 str 只会被赋值这一次,也就是取到的值为“hello wold"。
循环体与输出语句
do: 是与 for 循环起始语句配合使用的关键字,它标志着循环体的开始,在 do 和后面的 done 之间的语句就是每次循环时需要执行的操作。
echo Sstr:
echo: 是用于在终端输出信息的命令
$str: 是对前面定义的循环变量 str 的引用。由于在这个循环中,str 只被赋值为 "hello wold",所以当执行 echo $str 时,就会在终端输出 "hello wold"。
循环结束
done: 是 for 循环的结束关键字,它标志着整个 for 循环过程结束

总体而言,这段代码的功能就是将字符串 "hello wold" 赋值给循环变量 str,然后通过 echo 命令将其输出到终端。

3.for循环 例子

首先进入 bash
创建一个文件 如 vim 1.sh
代码如下:
for i in `seq 1 100`
do
         echo $i
done

或者
for i in $(seq 1 100)
do
         echo $i
done

进入到 bash 环境下 然后执行代码,这两种写法的功能都是一样的都是让i依次取从 1到 100 的值,然后在每次循环中打印出i的值。

for((i=1; i<100; i++))
do
         echo $i
done

在 for 循环的双括号语法(())中:
初始化部分i=1 是给循环变量i赋初值为 1。
条件判断部分 i< 100 表示只要i的值小于 100,循环就会继续执行。
迭代部分 i++ 是每次循环结束后让 i 的值自增 1,这样就能实现从 1开始,每次增加 1,直到 i 达到 99(因为当i等于100 时就不满足 i< 100 这个条件了),并在每次循环中通过echo 输出 i 的当前值。

4.while循环

方法一:

i=1
while (( $i<=10 ))
do
         echo $i
         ((i++))
done

变量初始化:
首先通过 i=1 这一行,将变量 ì初始化为 1,为后续的循环操作确定起始值。
循环条件判断:
while(( $i<=10))是循环的条件判断部分。这里使用了双括号 (()) 语法,它用于进行算术表达式的计算和判断。在每次循环开始前,都会检查 i 的值是否小于等于 10。只要这个条件满足,循环体内部的代码就会被执行
循环体执行内容:
在循环体内部,首先通过 echo $i 这一行,将当前i的值输出到控制台,这样就可以看到循环过程中i的变化情况。
接着,通过((i++))这一语句对变量 i 进行自增操作。这里的 (()) 语法同样用于算术运算,i++表示将 i的值增加 1。每次循环结束后,i 的值就会比上一次循环时增加 1,以便在下次循环开始时进行新的条件判断。

方法二:

i=1
while(( $i<=10 ))
do
         echo $i
         let "i++"
done

变量初始化与循环条件判断:
这部分和第一种实现方式完全相同。先是通过i=1初始化变量i,然后通过 while(($i<=10))来判断循环是否继续进行,只要i的值小于等于 10,循环就会持续。
循环体执行内容:
同样,在循环体中首先通过 echo $i 输出当前 i的值。
不同之处在于对变量 ;进行自增操作的语句。这里使用了let 命令,let "i++" 的作用也是将变量 i 的值增加 1。let 命令用于执行算术运算,它可以接受一个或多个算术表达式作为参数,并对相关变量进行相应的运算操作

总的来说,这两种实现方式都能达到通过 while循环输出1到10的整数的目的,只是在对变量进行自增操作时使用了不同的语法形式,但它们的功能是等效的。

八、until循环(until 直到为止)

1.until循环

脚本代码如下:
i=0 #初始化变量i的值为0,可以根据需要修改这个初始值
until [ ! $i -lt 10 ]
do
      echo $i
      ((i++))
done

1.1代码功能概述
这段代码是一个 until循环结构,用于在满足特定条件之前重复执行循环体中的操作。在这里,它会不断地输出变量i的值并对i进行自增操作,直到i的值不满足循环条件为止。
1.2循环条件分析
循环条件部分为 [ ! $i -lt 10 ],这里存在一些问题哦。在bash脚本中,用于条件测试 [] (等同于 test 命令)有其特定的语法规则。

2.case 语句

read -p "请您输入一个数值:" num
case $num in
          1)echo 您输入的数字是1
           ;;
          2)echo 您输入的数字是2
           ;;
          *)echo 您输入的是其他数字
           ;;
esac

以下是对这段代码的详细分析:
代码功能
这段 bash 脚本代码的主要功能是从用户那里获取输入的一个数值,然后根据输入的值进行不同的处理。如果输入的值是 1,就输出 "您输入的数字是 1" ;如果输入的值是 2,就输出  "您输入的数是 2" ;如果输入的是其他任何值,就输出 "您输入的是其他数字" 。
代码结构及各部分含义
获取用户输入:

        read -p "请您输入一个数值:" num: 这里使用 read 命令来读取用户从键盘输入的内容。-p 选项用于在等待输入之前向用户显示提示信息,在这个例子中,提示信息是 "请您输入一个数值:" ,用户输入的内容会被存储到变量 num 中。
条件判断与处理(case 语句部分):
case $num in:
这是 bash 中的 case 语句的起始标识,用于根据变量 num 的不同取值来执行不同的代码块
          1)、2)和 *)部分:
                1): 当变量 num 的值等于 1时,会执行这部分代码,即 echo 您输入的数字是1,然后通过 ;; 结束这个分支的执行。
                 2): 同理,当 num 的值等于 2 时,执行 echo 您输入的数字是2,并以 ;;  结束。
                 *):这是一个通配符分支,当 num 的值既不等于 1也不等于 2 时,就会执行这部分代码,即 echo 您输入的是其他数字,最后也以 ;; 结束整个 case 语句。

3.基本函数学习

一个函数我们要怎么创建 要怎么引用
代码如下:
DemoFunc () {
          echo "hello world"
}
DemoFunc
DemoFunc

代码功能
这段代码定义了一个名为 DemoFunc 的函数,函数体内部仅包含一条语句,即输出字符串“hello world"。然后通过调用 DemoFunc 来执行这个函数,从而使得 "hello world" 被输出到控制台(假设这是在一个支持函数定义和调用的脚本环境中运行,比如 bash 脚本环境等)。
函数定义部分:
       DemoFunc() {: 这是函数定义的开头部分,声明了函数名为 DemoFunc,后面紧跟着的大括号 { 表示函数体的开始。
       echo "hello world": 这是函数体内部的唯一 一条语句,它的作用是将字符串 "hello world" 输出到控制台。当函数被调用时,这条语句就会被执行。
        }: 这是函数体的结束大括号,标志着 DemoFunc 函数定义的完成。
函数调用部分:
        DemoFunc: 这单独的一行就是对前面定义好的 DemoFunc函数进行调用。当执行到这一行时,就会跳转到 DemoFunc 函数的定义处,执行函数体内部的语句,也就是会输出 "hello world" 到控制台。

代码二:
DemoFunc () {
         echo "hello world"
         echo "My name is $1: "
}
DemoFunc xiaobai

代码功能
这段代码定义了一个函数 DemoFunc,然后调用了该函数并传递了参数 xiaobai。函数 DemoFunc 的功能是在被调用时,先输出固定的字符串 "hello world",接着输出一个包含参数值的字符串 "My name is $1:",这里的 $1 表示函数接收到的第一个参数。
代码执行过程
函数定义:

         DemoFunc() {: 这部分声明了函数名为 DemoFunc,大括号内是函数体内容。
         echo "hello world": 当函数被调用时,这是函数体中首先执行的语句,会将字符串 "hello world" 输出到控制台。
         echo "My name is $1:" :在输出 "hello world" 之后,会执行这条语句。由于在调用函数 DemoFunc 时传递了参数 xiaobai此时 $1 的值就被设置为 xiaobai,所以这条语句会输出 "Myname is xiaobai:" 。
         }: 结束函数 DemoFunc 的定义。
函数调用:
         DemoFunc xiaobai: 这行调用了已经定义好的 DemoFunc 函数,并将参数 xiaobai 传递给它。

多函数调用 代码三:
DemoFunc () {
         echo "hello world"
         echo "My name is $1,and my age is $2 years old"
}
DemoFunc xiaobai 27

九、不同脚本的互相调用

1.互相调用

首先使用  rm*.sh  删掉所有shell脚本,然后vim 2.sh(新建一个sh脚本文件)  
echo "hello word"
在创建一个 3.sh 脚本文件 vim 3.sh   输入  . 2.sh
bash执行 2.sh 你会发现输出了3.sh的内容

方法二
source 3.sh 写入到 2.sh 中去 就可以了
ok刚刚的例子就很简单 我们接下来演示变量的调用

脚本1如下:
2.sh  设置两个变量
name="wanhao"
age=23

脚本2:
source 3.sh
echo "My name is $name,and i am $age years old"
bash 3.sh

2.重定向

2.1输出重定向

ls > 1.txt
cat 1.txt

who > 1.txt
cat > 1.txt

从这两个例子得出,可以覆盖原有的内容。我们前面讲过 >> 就可以追加内容
ls >> 1.txt
cat 1.txt

我们把 ls 命令重定向到垃圾桶回收站 它会发生什么呢
ls  > /dev/null
已经执行 但是没有回显

2.2输入重定向

简单的输入重定向示例(一)
假设你有一个文本条件dirs.txt ,里面写着几个目录名称,例如:
/home/user/Documents
/home/user/Pictures
/home/user/Music

         你可以使用Is命令结合输入重定向来查看这些目录下的文件。
在终端输入 Is -l < dirs.txt 。这里的 -l 选项是为了以长格式显示文件信息。
         这个命令会从 dirs.txt 文件中读取目录名称作为 Is -l 命令的输入,然后分别列出这些目录下文件的详细信息,比如文件权限、所有者、大小、修改时间等内容。
简单的输入重定向示例(二)
         假如你有一个文件 subdirs.txt,内容是一个主目录下各个子目录的名字,例如:
subdir1
subdir2
subdir3
         你可以通过以下命令来查看这些子目录中的内容: ls < subdirs.txt
         这样,ls 命令就会从 subdirs.txt 文件中读取每个子目录的名字,并列出这些子目录中的文件和文件夹(如果有)。

3.文件描述符

0 1 2
0: 标准输入
1: 标准输出
2: 错误输出
例子
Is > 8.txt 2>9.txt
如果输出正确 就会输出到 8. txt
cat 8. txt


coo > 8.txt 2> 9.txt
如果输出错误 就会输出到 9. txt
cat 9.txt

总结:先正向,后逆向,先知攻,后知防,一步一步的来,不要做井底之蛙,不要浮于表面,要看清本质!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值