Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nodeStudy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
马旭烽
nodeStudy
Commits
7caf018d
Commit
7caf018d
authored
Jul 08, 2023
by
马旭烽
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
✨
feat: bash 学习教程
parent
40ee345f
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
260 additions
and
0 deletions
+260
-0
第一课.md
shell/第一课.md
+32
-0
第三课传递参数.md
shell/第三课传递参数.md
+35
-0
第二课变量.md
shell/第二课变量.md
+193
-0
No files found.
shell/第一课.md
0 → 100644
View file @
7caf018d
# 前言
# 前言
本次学习的 Bash 也就是
`Bourme Again Shell`
。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell, 所以像 #!/bin/sh 也可以改成 #!/bin/bash
`#!`
告诉系统其后路径所指定的程序即使解释此脚本文件的 shell 程序
# 第一个 shell 脚本
```
bash
#!/bin/bash
echo
"Welcome to World"
```
# 运行 shell 两种途径
## 作为可执行陈旭
```
bash
chmod
+x ./test.sh
# 使脚本具有执行权限
./test.sh
# 执行脚本
```
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
## 作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
```
bash
/bin/sh test.sh
/bin/php test.php
```
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
\ No newline at end of file
shell/第三课传递参数.md
0 → 100644
View file @
7caf018d
# 传递参数
# 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
实例
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):
```
bash
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo
"Shell 传递参数实例!"
;
echo
"执行的文件名:
$0
"
;
echo
"第一个参数为:
$1
"
;
echo
"第二个参数为:
$2
"
;
echo
"第三个参数为:
$3
"
;
```
|参数处理|说明|
|---|---|
|$# |传递到脚本的参数个数|
|$
* |以一个单字符串显示所有向脚本传递的参数。如"$*
"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。|
|$$ |脚本运行的当前进程ID号|
|$! 后台运行的最后一个进程的ID号|
|$@| 与$
*
相同,但是使用时加引号,并在引号中返回每个参数。|
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
|$-| 显示Shell使用的当前选项,与set命令功能相同。|
|$?| 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。|
$
*
与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 "
*
" 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
\ No newline at end of file
shell/第二课变量.md
0 → 100644
View file @
7caf018d
# Shell 变量
# Shell 变量
定义变量时,变量名不加美元符号($,PHP语言中变量需要, PowerShell 也需要),如:
```
bash
your_name
=
"runoob.com"
```
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
-
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
-
中间不能有空格,可以使用下划线 _。
-
不能使用标点符号。
-
不能使用bash里的关键字(可用help命令查看保留关键字)。
# 语句赋值
```
bash
for
file
in
`
ls
/etc
# or
for
file
in
${
ls
/etc
}
# 以上语句将 /etc 下目录的文件名循环出来。
```
# 使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
```
bash
your_name
=
"qinjx"
echo
$your_name
echo
${
your_name
}
```
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
```
bash
# 如果不加 系统会把 $skillScript 当作一个变量
# 推荐给所有变量加上花括号,这是个好的编程习惯。
for
skill
in
Ada Coffe Action Java
;
do
echo
"I am good at
${
skill
}
Script"
done
```
# 只读变量
在赋值后,添加关键字
`readonly`
修饰,后续添加会报错
```
bash
#!/bin/bash
myUrl
=
"https://www.google.com"
readonly
myUrl
myUrl
=
"https://www.runoob.com"
```
# 删除变量
unset 关键字,不能删除只读变量
```
bash
#!/bin/sh
myUrl
=
"https://www.runoob.com"
unset
myUrl
echo
$myUrl
```
# 变量类型
运行shell时,会同时存在三种变量:
-
局部变量 ,由脚本或者命令定义的,仅在当前 shell 生效,其它启动 shell 无法访问
-
环境变量, 所有程序,包括 shell 都能访问的变量,有些程序运行需要环境来保证其正常运行,必要的时候 shell 脚本也可以定义环境变脸
-
shell 变量,由 shell 程序设置的变量, shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证 shell 正常运行
# Shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
## 单引号字符串:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
## 双引号
```
bash
your_name
=
"runoob"
str
=
"Hello, I know you are
\"
$your_name
\"
!
\n
"
echo
-e
$str
```
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
## 拼接字符串
```
bash
your_name
=
"runoob"
# 使用双引号拼接
greeting
=
"hello, "
$your_name
" !"
greeting_1
=
"hello,
${
your_name
}
!"
echo
$greeting
$greeting_1
# 使用单引号拼接
greeting_2
=
'hello, '
$your_name
' !'
greeting_3
=
'hello, ${your_name} !'
echo
$greeting_2
$greeting_3
```
## 获取字符串长度
```
bash
string
=
"abcd"
echo
${#
string
}
# 输出 4
```
变量为字符串时,${#string} 等价于 ${#string
[
0
]
}:
## 提取子字符串
```
bash
string
=
"runoob is a great site"
echo
${
string
:1:4
}
# 输出 unoo
```
## 查找子字符串
```
bash
string
=
"runoob is a great site"
echo
`
expr
index
"
$string
"
io
`
# 输出 4
```
# Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
# 定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
```
bash
array_name
=(
value0 value1 value2 value3
)
```
还可以单独定义数组的各个分量:
```
bash
array_name[0]
=
value0
array_name[1]
=
value1
array_name[n]
=
valuen
```
可以不使用连续的下标,而且下标的范围没有限制
# 获取数组的长度
```
bash
# 取得数组元素的个数
length=${#array_name
[
@
]
}
# 或者
length=${#array_name
[
*
]
}
# 取得数组单个元素的长度
lengthn=${#array_name
[
n
]
}
```
# Shell 注释
以 # 开头的行就是注释,会被解释器忽略。
通过每一行加一个 # 号设置多行注释,像这样:
```
bash
#--------------------------------------------
# 这是一个注释
# author:菜鸟教程
# site:www.runoob.com
# slogan:学的不仅是技术,更是梦想!
#--------------------------------------------
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
##### 用户配置区 结束 #####
```
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
## 多行注释
`bash
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
```
```
bash
:<<
'
注释内容...
注释内容...
注释内容...
'
:<<
!
注释内容...
注释内容...
注释内容...
!
```
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment