首页 > 数据库 > 数据库开发技术 > Kali Linux Shell编程基础
bash,负责向内核翻译以及传达用户/程序指令。Shell 既是一种命令语言,又是一种程序设计语言。
交互指令模式 :人工输入命令,执行效率低
非交互指令模式:使用脚本,在后台执行,需要程序员编写
bash,使用cat /etc/shells可以查看电脑上有哪几种shell解释器:
我这里使用的是 zsh,可以说是个性话的bash解释器。如果我们向切换解释器只需要在,命令行中输入对应的解释器即可!输入 exit就可以退出当前shell解释器,我们登录linux系统后,进入的界面就是shell解释器,我们使用pstree查看进程树
我采用的是 ssh链接到服务器,由于默认的解释器是zsh ,所以一进去系统就是zsh的交互界面。如果我们此时输入 exit 退出当前解释器,那么就会自动终端我们的ssh连接。#!/bin/bash
echo hello worldecho shell脚本
输入绝对或者相对路径 执行 ,需要脚本具有可执行权限
输入 bash [脚本名/路径] ,重新开辟一个bash解释器,执行脚本,并且执行完毕后自动退出开辟的shell脚本。无需可执行权限
输入 source 脚本名/路径 ,在当前解释器里执行脚本,执行完毕解释器状态会改变,也无需可执行权限
cd ~mkdir bash
使用 source执行:
退出shell脚本使用 exit命令即可set查看所有定于的变量变量的类型有如下几种:自定义变量
环境变量
位置变量
预定义变量
自定义变量以及使用
我们在自定义变量的时候,可能要求和其他编程语言语法有些不同,但是大致语法一致!命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
变量名不加美元符号 $
a=10b= "10"echo $aecho $b
for file in `ls /etc`或for file in $(ls /etc)
$变量名的形式取出来,但是有如下情况,我们向变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,例如:a=5echo 我是第$a个程序员
a,而去把变量名理解成了 a个程序员,这里少了什么?少了边界!如果我们使用{}括起来,完美解决了:echo 我是第${a}个程序员
只读变量: 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。例如:a=10readonly aa=11#错误 zsh: read-only variable: a
unset aenv 命令就可以输出所有环境变量!bash有两个基本的系统级配置文件:/etc/bashrc和/etc/profile。这些配置文件包含了两组不同的变量:shell变量和环境变量。shell变量是局部的,而环境变量是全局的。环境变量是通过shell命令来设置。设置好的环境变量又可以被所以当前用户的程序使用。常用的环境变量如下:USER UID HOME PATH SHELL PS1 PS2 TMOUT这些都是大写命令组成,我们shell可以直接使用它,我们简单介绍一下 PS1 PS2 TMOUT\连接符换到下一行输入,此时,bash的提示符就是二级提示符:
那么我们如果添加 PATH呢?使用export指令,将a.out的路径添加到搜索路径当中,命令:export PATH=$PATH:路径 (PATH中路径是通过冒号“:”进行分隔的,把新的路径加在最后就OK)$1 $2 可以取出对应的变量。常用的预定义变量有很多 ,如 $ # * @ ? 0 ! 我们直接使用shell脚本展示一下echo 位置变量和预定义变量echo 1:$1echo 2:$2echo '$':$$echo '#':$#echo *:$*echo @:$@echo ?:$?echo !:$!
# $#变量是命令行参数或位置参数的数量
?,$? 变量是最近一次执行的命令或shell脚本的出口状态,0表示成功 非零表示错误
$ ,$$ 变量是shell脚本里面的进程ID。Shell脚本经常使用 $$ 变量组织临时文件名,确保文件名的唯一性。
!,&! 变量的值是最近运行的一个后台进程的PID ,我们执行命令的时候使用 &,可以让程序后台执行,使用&!获取它的进程号
* ,$* 变量的值表示所有的位置参数,其值是所有位置参数的值
@,$@ 变量的值类似于$*,表示所有的位置参数,其值也是所有位置参数的值。
“” 界定范围‘’ 界定范围并且屏蔽特殊符号!a=10 ,声明的是局部变量,只能在当前bash中使用,如果我们新开一个bash, a变量就未定义了!有局部就有全局,我们可以将一个定义完成的变量声明为全局变量 使用 export 变量名 ,也可以边定义边 声明为全局 export a=10 ,如果想取消它的全局身份,我们需要输入 export -n a 这样a转换成为局部变量了。read 命令read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项。会使用 -p ,我感觉就够了read -p "请输入变量 n" necho 输入变量为$n
stty -echo 屏蔽键盘输入bash的内容 却不屏蔽系统输出 ,再次输入stty echo就会恢复了。当然如果我们想把系统的回显也屏蔽呢?我们可以把 该命令的标准错误和 标准输出都重定向到 /dev/null中,如下ls &> /dev/null
+ - * / %,不必多言我们使用 expr命令来运算表达式并且输出:例如echo + :expr 1 + 5echo / :expr 1 / 2echo \* :expr 5 \* 6echo % :expr 6 % 4echo 使用 echo '$[]'echo $[5*6]
* 是特殊符号,需要转义
如果使用let ,如下:
当然让我们也可使用 let a++ 来自增变量 -- += -= ... 等C语言出现过的一元赋值运算符都是一个道理。很可惜的是 shell脚本无法直接使用小数计算| 来计算小数例如:echo "scale=3;10/3" | bc
if
case
for
while
[ ]包括起来,注意表达式与 []两侧有空格隔离,并且条件运算符之间也需要空格隔离 ,这是为了防止识别成一个变量,关系运算符有 (列举常用的)= 相等 ,常用字符类数据对比
!= 不相等 ,常用字符类数据对比
-z 判断字符串长度是否为0
-eq 等于,这个以及下面的常用于数值类型数据对比
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
! 取非
-e 判断文件或者目录是否存在
-f 判断 是否为文件
-d判断是否为目录
-r 判断是否可读(root用户 无效)
-w 判断是否可写(root用户 无效)
-x 判断是否可执行
&& || 含义无需多少了, ,和C语言一样 这里也存在逻辑短路的特性!使用逻辑短路可以完成一些条件判断[ $USER != root ] || echo root
如果我们要判断一个变量是否为空 我们需要这样操作: [ -Z "$变量" ] , -Z判断字串长度是否为0
当然我们可以采用这样的书写方式 [[ -z $g ]] && echo 空, 规则如下:[ -z "$g" ] 单对中括号变量必须要加双引号[[ -z $g ]] 双对括号,变量不用加双引号.当然还有存在一个符号 ; 这里提一下 多个指令可以;隔开,; 可以看作没有逻辑功能的 运算符,可以利用它将多个命令写在一行内。# 语法一if 条件表达式 ; then命令序列fi//表示if语句块结束#语法 2if 条件表达式then命令序列fi//表示if语句块结束#例如read -p "请输入用户名" uif [ -z $u ] ; thenecho "请输入用户名"#...处理exitfi
{}来标记语句块,shell的做法是 采用 fi 倒序的if来标记if语句的结束 。语法一和语法二 的区别不大,主要是是否使用 ; 来将命令放在一行# 双分支if 条件语句 ; then#命令序列else#命令序列if# 多分支if 条件语句 ; then#命令序列elif 条件语句 ; then#命令序列elif 条件语句 ; then#命令语句#...else#命令序列fi
case 值 in模式1)命令序列;;模式2)命令序列;;*)默认情况;;esac
for 变量名 in 值列表do命令序列done#例如for i in {1..10}doecho &idonofor i in a b cdo#这样也会循环三次echo abcdono#如果你想使用 变量来控制 循环测试 请使用 seq命令for i in `seq 10`do# 条件语句done
# 条件语句为真 循环while 条件语句do# 任务序列done# 另外一种形式 永远执行命令序列,无限循环while :do#命令序列done
alias 来给一些命令起别名,比如 我们.bashrc中就定义着许多变量的别名,我们当然也可以手动更改。shell中的函数,我感觉理解成加强版的alias不错,函数是为了给一堆命令序列起别名,使用函数和使用命令的语法是一致的。例如:fun(){echo 函数的使用和命令一样for i in $*doecho $idone}fun c1 c2 c3
$? 取返回值。这里就说明了 返回值为啥是 0-255的原因了myping(){ping -c1 -W1 $1 &> /dev/null[ $? -eq 0 ] && echo "$1 is open"}# 获取主机ipa=` ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/' `echo $ab=`echo ${a%.*}`echo "测试网段为 ${b}.x"#pingfor i in `seq 254`domyping ${b}.${i} &donewait
wait配合 & 后台执行 相当于 C语言的fork语句更多教程 关注我们原文作者:Kali笔记;如有侵权,请联系管理员删除。