shell 入门基础
一、 Shell变量
1. 变量可分为两类: 环境变量(全局变量) 和 局部变量 。
环境变量 : 所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、shell脚本和各类应用 。
环境变量可以在命令行中设置,但用户退出时这些变量值也会丢失,因此最好在用户家目录下的.bash_profile文件中或全局配置
/etc/bashrc、/etc/profile文件或者/etc/profile.d/ 中定义 。 将环境变量放入profile文件中 , 每次用户登录时这些变量值都将被初始化
所有环境变量均为大写。
环境变量应用于用户进程前,必须用export命令或source或"."命令导出。
通过百度 查看一些linux常用的系统环境变量。
常用的环境变量 :
(1) 修改 history命令显示的历史命令记录数: HISTFILESIZE=5
HISTSIZE=5
(2) 查看系统文件的类型: $HOSTTYPE
(3) 查看系统主机名: $HOSTNAME
局部变量 :
定义变量 : (1) 变量名=value
(2) 变量名='value' , 使用单引号中的内容是什么就是什么,里面如果有变量是不会进行解析的。
(3) 变量名="value" , 使用双引号引的内容中,如果有变量会将变量解析成内容进行显示
考题 : a = 192.168.1.2
b = '192.168.1.2'
c = "192.168.1.2"
a = 192.168.1.2 - $a
b = '192.168.1.2 - $a'
c = "192.168.1.2 - $a"
echo "a = $a"
echo "b = $b"
echo "c = ${c}"
注: $a 与 ${c} 是一样的效果
答案 : a = 192.168.1.2 - 192.168.1.2
b = 192.168.1.2 - $a
c = 192.168.1.2 - 192.168.1.2 - 192.168.1.2
将变量作为内容的两种方式:
(1) cmd = `date + %F`
(2) cmd = $(date + %F)
什么时候使用${var}这种带大括号的场景 ?
如: tar -xzvf fcz_$pwd_log.tar.gz ,系统不知道是pwd做为变量 还是 pwd_log做为变量
此时如果使用大括号 tar -xzvf fcz_${pwd}_log.tar.gz 明确告诉系统pwd是变量,而pwd_log不是变量 。
shell 特殊变量 :
(1) 位置变量
$0 获取当前执行的shell脚本的文件名
fcz.sh中的内容 : echo $0
sh fcz.sh => fcz.sh
sh /root/fcz.sh => /root/fcz.sh // 这种运行方式,会将路径一起打印出来
fcz.sh中的内容 : dirname $0 => /root
fcz.sh中的内容 : basename $0 => fcz.sh
$n 获取第n个参数,当n>=10时,要在数字上添加{} ,即${10}
$* 获取当前shell的所有参数,将所有的命令行参数视为单个字符串
$# 获取当前shell命令行中参数的总个数
$@ 获取这个程序的所有参数 "$1" "$2" "$3" "$4" "..." , 这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白。
(2) 进程状态变量
$$ 获取当前shell的进程号 ( PID )
$! 执行上一个指令的PID
$? 获取执行上一个指令的返回值 ( 0为成功,非零为失败)
$?的使用场景 : 1. 编程时判断语句是否执行成功
2. 控制台执行语句时,判断上一条语句是否执行成功 . echo $?
$?返回值参考:
0 : 表示运行成功
2 : 权限拒绝
1 ~ 125 : 表示运行失败,脚本命令、系统命令错误或参数传递错误
126 : 找到该命令了,但是无法执行
127 : 未找到要运行的命令
>128 : 命令被系统强制结束
提示 : 在脚本调用,一般用 exit 0 , 函数 return 0
bash 内部变量:
由shell本身提供,常用的内部命令有: echo , eval , exec , export , readonly , read , shift , wait , exit 和 (.) 等
二、 变量的子串操作
1. ${#string} : 返回$string的长度
2. ${string:position} : 在$string中,从位置$position之后开始提取子串
3. ${string:position:length} : 在$string中,从位置$position之后开始提取长度为$length的子串
4. ${string#substring} : 从变量$string开头开始删除最短匹配$substring子串
5. ${string##substring} : 从变量$string开头开始删除最长匹配$substring子串
6. ${string%substring} : 从变量$string结尾开始删除最短匹配$substring子串
7. ${string%%substring} : 从变量$string结尾开始删除最长匹配$substring子串
8. ${string/substring/replace} : 使用$replace 来代替第一个匹配的$substring
9. ${string/#substring/replace} : 如果$string前缀匹配$substring , 就用$replace来代替匹配$substring
10. ${string/%substring/replace} : 如果$string后缀匹配$substring , 就用$replace来代替匹配$substring
11. ${string:-str2} : 如果变量string有定义,就返回string的值,如果string没有定义,就返回str2的值。
eg : result = ${fcz:-FENGCONGZHI}
echo $result
输出:FENGCONGZHI
echo $fcz
输出:空
12. ${string:=str2} : 如果变量string有定义,就返回string的值,如果string没有定义,就把str2的值赋值给string,并把str2的值返回。
eg : result = ${fcz:-FENGCONGZHI}
echo $result
输出:FENGCONGZHI
echo $fcz
输出:FENGCONGZHI // 这个地方与上一个输出不同
13. ${string:?"not defined"} : 如果变量string未定义,就抛出异常 -bash: string: command not defined
14. ${string:+str2} : 如果变量string定义了就返回str2的值
15. ${string-str2} : 类似于 ${string:-str2}
二、变量的数值计算
1. 变量的数值计算常见的有如下几个命令:
(()) 、 let 、 expr 、 bc 、 $[]
(1) (())用法 : 很常用,且效率高
场景 : 执行简单的整数运算.
eg : ((a = 1+2**3 -4%3))
echo $a
输出 : 8
echo $((a+=1))
输出 : 9
(2) let赋值表达式 : ( 效率没有"(())" 高 )
eg : let a = a+10
echo $a
输出 : 19
(3) expr 用法: 略
eg : 通过expr判断变量是否为整数
expr a + 0 => expr : 语法错误
expr $? => 2 // 不等于0表示上面的语句执行失败
expr 1 + 0 => 1
expr $? => 0 // 0表示上面的语句执行成功
(4) bc 用法: 支持小数的功能
i=2
echo $i+1 => 2+1
echo $i+1|bc => 3
(5) typeset 用法 :
typeset -i A=1 B=3
A=A+B
echo $A => 4
(6) $[] 用法 :
echo $[ 2+3 ] => 5
三、shell 变量的输入
Shell 变量除了可以 直接赋值 或 脚本传参 外,还可以使用read命令从标准输入获得.
语法格式:
read [参数] [变量名]
常用参数:
-p prompt : 设置提示信息
-t timeout : 设置输入等待的时间,单位默认为秒。
eg : read -p "pls input a number:" name1 name2
pls input a number:fcz zxy
echo $name1 $name2 => fcz zxy
四、语法
1. 条件测试语法
格式1: test <测试表达式>
格式2: [ <测试表达式> ]
格式3: [[ <测试表达式> ]]
说明: 格式1和格式2 是等价的 , 格式3为扩展的test命令.
在[[ ]] 中可以使用通配符进行模式匹配。 && 、 || 、 > 、 < 等操作可以应用于[[ ]]中,但不能应用于[]中。
eg :
(1) 测试文件是否存在
test -f file && echo true || echo false
[ -f file ] && echo true || echo false
[ -d file ] && echo true || echo false // 测试file是不是目录
[ -x file ] && echo true || echo false // 测试file是不是可执行的文件
(2) test命令非 (!) 的写法
test ! -f file && echo true || echo false
常用文件测试操作符号:
-f : 若文件存在且为普通文件则真
-d : 若文件存在且为目录文件则真
-s : 若文件存在且不为空(文件大小非0)则真
-e : 若文件存在则真,要区别 -f
-r : 若文件存在且可读则真
-w : 若文件存在且可写则真
-x : 若文件存在且可执行则真
-L : 若文件存在且为链接文件则真
f1 -nt f2 : 若文件f1比文件f2新则真
f1 -ot f2 : 若文件f1比文件f2旧则真
2. 字符串测试语法 :
常用字符串测试操作符
-z "字符串" : 若串长度为0则真 ,
-n "字符串" : 若串长度不为0则真,
"串1" = "串2" : 若串1等于串2则真,
"串1" != "串2" : 若串1不等于串2则真.
注: 以上比较时字符串一定要用引号引起来.
3. 数值比较语法 :
在[ ]中比较符 : -eq 、 -ne 、 -gt 、 -ge 、 -lt 、 -le 、 -a 、 -o
在(( )) 和 [[ ]]中比较符 == 、!= 、 > 、 >= 、 < 、 <= 、 && 、 ||
4. if 语法
单分支:
if 条件
then
指令
fi
双分支:
if 条件
then
指令
else
指令
fi
多分支:
if 条件
then
指令
elif 条件
then
指令
else
指令
fi
5. case 结构条件句语法:
case "字符串变量" in
值 1) 指令 1... ;;
值 2) 指令 2... ;;
*) 指令...
esac
eg : 根据用户的输入判断是哪个数字
read -p "please input a number:" ans
case "$ans" in
1)
echo "the num you input is 1"
;;
2)
echo "the num you input is 2"
;;
[3-9])
echo "the num you input is $ans"
;;
*)
echo "the num you input must be less 9"
esac
shell 入门基础的更多相关文章
- Linux shell入门基础(六)
六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...
- Linux shell入门基础(一)
Linux shell入门基础(一): 01.增加删除用户: #useradd byf userdel byf(主目录未删除) userdel -r byf 该用户的属性:usermod 用 ...
- Linux shell入门基础(八)
八.shell脚本sed&awk 01.sed的使用 流编辑器-Steam Editor #ed /etc/passwd 1,10p …… 1s/root/byf/p(替换root为byf) ...
- Linux shell入门基础(二)
二.shell对文本的操作 01.查看文本的命令 #cat /etc/passwd(并非对文本文件操作) #tail -5 /etc/passwd(查看末尾5行) #tail -f /var/log/ ...
- shell入门基础&常见命令及用法
shell shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法 shell脚本 以.sh结尾 shell语法+linux命令 注释: 单行 ...
- shell入门基础必备
作者:KornLee 2005-02-03 15:32:57 来自:Linux先生 1.建立和运行shell程序 什么是shell程序呢? 简单的说shell程序就是一个包含若干行 shel ...
- Shell入门基础
Shell的Helloworld #!/bin/bash echo "helloworld taosir" 执行方式 方式一:用 bash 或 sh 的相对或绝对路径(不用赋予脚本 ...
- Linux shell入门基础(七)
七.bash脚本中的流程控制 条件判断控制 -[]([]中的表达式是否为真) &&(前边的结果是true的时候执行后边的命令) ||(前边的结果是false的时候执行后边 ...
- Linux shell入门基础(五)
五.bash运算及启动脚本 01.使用bash的命令历史 #history …… #set(显示所有的变量) | grep HIS HISTFILE=/root/.bash_history HISTF ...
随机推荐
- 原 the app referencesnon-public selectors in payload
摘要 当我们上传验证的时候,出现了the app referencesnon-public selectors in payload/项目名.app/项目:字符 的警告的解决办法 当我们上传验证的时候 ...
- [译]TLS中的RC4被攻破了,现在该怎么办?
原文链接:https://community.qualys.com/blogs/securitylabs/2013/03/19/rc4-in-tls-is-broken-now-what 原文发表时间 ...
- 每天一个linux命令:【转载】more命令
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...
- 基于 task 为 VSCode 添加自定义的外部命令
我们有很多全局的工具能在各处使用命令行调用,针对某个仓库特定的命令可以放到仓库中.不过,如果能够直接为顺手的文本编辑器添加自定义的外部命令,那么执行命令只需要简单的快捷键即可,不需要再手工敲了. ...
- python(七):元类与抽象基类
一.实例创建 在创建实例时,调用__new__方法和__init__方法,这两个方法在没有定义时,是自动调用了object来实现的.python3默认创建的类是继承了object. class A(o ...
- Python学习-字典练习:简单通讯录
功能要求: 查询联系人,输入姓名,可以查询当前通讯录里面的联系人信息,若联系人存在,则输出联系人信息,若不存在,则告知 插入联系人,可以向通讯录中新建联系人,若联系人已经存在,则询问是否修改联系人信息 ...
- 【C#】datetimepicker初始为空值的方法
方法一: 在窗口初始化函数中添加: dateTimePickerEnd.Format = DateTimePickerFormat.Custom; dateTimePickerEnd.CustomFo ...
- Spark的CombineByKey
combineBykey关键是要明白里面的三个函数: 1. 当某个key第一次出现的时候,走的是第一个函数(createCombin):A function that creates a combin ...
- xml获取属性值的方法
sSqlstr += string.Format(@" and businessattr.value('(/Arch/Field[@Name=""发文单位$$" ...
- Android中处理崩溃异常 (转)
大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...