shell: bash和dash
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell: bash和dash相关的知识,希望对你有一定的参考价值。
参考技术A 两种方法:sudo ln -s /bin/bash /bin/sh
强制把/bin/sh的软链接改到bash中。
sudo dpkg-reconfigure dash
弹出来个选择项,把“dash设为默认shell”选择no。
文件开头加上 #!/bin/bash
该脚本拥有执行权限,通过脚本名直接运行时,使用bash执行
1.定义函数
bash: function在bash中为关键字
dash: dash中没有function这个关键字
2.select var in list; do command; done
bash:支持
dash:不支持, 替代方法:采用while+read+case来实现
bash:支持n..m展开
dash:不支持,替代方法, 采用seq外部命令
bash:支持here string
dash:不支持, 替代方法:可采用here documents
bash: 当word为非数字时,>&word变成重定向标准错误和标准输出到文件word
dash: >&word, word不支持非数字, 替代方法: >word 2>&1; 常见用法 >/dev/null 2>&1
bash: 支持数组, bash4支持关联数组
dash: 不支持数组,替代方法, 采用变量名+序号来实现类似的效果
bash: 支持 parameter:offset
dash: 不支持, 替代方法:采用expr或cut外部命令代替
bash: 支持 parameter^^pattern, parameter,,pattern
dash: 不支持,替代方法:采用tr/sed/awk等外部命令转换
bash: 支持进程替换
dash: 不支持, 替代方法, 通过临时文件中转
bash: 支持两者
dash: 只支持=
bash: 支持[[ ]], 可实现正则匹配等强大功能
dash: 不支持[[ ]], 替代方法,采用外部命令
bash: 支持C语言格式的for循环
dash: 不支持该格式的for, 替代方法,用while+$((expression))实现
bash: 有内置命令let, 也支持((expression))方式
dash: 不支持,替代方法,采用$((expression))或者外部命令做计算
bash: 支持id++,id--,++id,--id这样到表达式
dash: 不支持++,--, 替代方法:id+=1,id-=1, id=id+1,id=id-1
参考:
http://www.linuxfly.org/post/686/
了解 dash shell 与 zsh shell
#其他shell: dash shell,zsh shell
dash shell
dash shell特性
尽管bash shell和dash shell都以Bourne shell为样板,由于dash的目标是简洁,因此它的环境变量比bash shell少多了。dash变量和bash变量之间有一个巨大的差异,dash shell不支持数组。
一、dash 命令行参数
dash命令行参数
参 数 描 述
-a 导出分配给shell的所有变量
-c 从特定命令字符串中读取命令
-e 如果是非交互式shell的话,在有未经测试的命令失败时立即退出
-f 显示路径名通配符
-n 如果是非交互式shell的话,读取命令但不执行它们
-u 在尝试展开一个未设置的变量时,将错误消息写出到 STDERR
-v 在读取输入时将输入写出到 STDERR
-x 在执行命令时将每个命令写出到 STDERR
-I 在交互式模式下,忽略输入中的 EOF 字符
-i 强制shell运行在交互式模式下
-m 启用作业控制(在交互式模式下默认开启)
-s 从 STDIN 读取命令(在没有指定文件参数时的默认行为)
-E 启用emacs命令行编辑器
-V 启用vi命令行编辑器
二、dash 环境变量
1. 默认环境变量
dash shell用 set 命令来显示环境变量
2. 位置参数
$0 :shell的名称。
$n :第n个位置参数。
$* :含有所有参数内容的单个值,由 IFS 环境变量中的第一个字符分隔;没定义 IFS 的话,由空格分隔。
[email protected] :将所有的命令行参数展开为多个参数。
$# :位置参数的总数。
$? :最近一个命令的退出状态码。
$- :当前选项标记。
$$ :当前shell的进程ID(PID)。
$! :最近一个后台命令的PID。
3. 用户自定义的环境变量
$ testing=10 ; export testing -- 如果不用 export 命令,用户自定义的环境变量就只在当前shell或进程中可见
$ echo $testing
10
三、dash 内建命令
dash shell内建命令
命 令 描 述
alias 创建代表文本字符串的别名字符串
bg 以后台模式继续执行指定的作业
cd 切换到指定的目录
echo 显示文本字符串和环境变量
eval 将所有参数用空格连起来 ①
exec 用指定命令替换shell进程
exit 终止shell进程
export 导出指定的环境变量,供子shell使用
fg 以前台模式继续执行指定的作业
getopts 从参数列表中中提取选项和参数
hash 维护并提取最近执行的命令及其位置的哈希表
pwd 显示当前工作目录
read 从 STDIN 读取一行并将其赋给一个变量
readonly 从 STDIN 读取一行并赋给一个只读变量
printf 用格式化字符串显示文本和变量
set 列出或设置选项标记和环境变量
shift 按指定的次数移动位置参数
test 测试一个表达式,成立的话返回 0 ,不成立的话返回 1
times 显示当前shell和所有shell进程的累计用户时间和系统时间
trap 在shell收到某个指定信号时解析并执行命令
type 解释指定的名称并显示结果(别名、内建、命令或关键字)
ulimit 查询或设置进程限制
umask 设置文件和目录的默认权限
unalias 删除指定的别名
unset 从导出的变量中删除指定的变量或选项标记
wait 等待指定的作业完成,然后返回退出状态码
dash 脚本编程
创建 dash 脚本
在shell脚本的第一行指定:#!/bin/dash
不能使用的功能
1. 算术运算
dash shell支持 expr 命令和双圆括号方法,但不支持方括号方法。
2. test 命令
test 命令不能识别用作文本比较的==符号,只能识别=符号
3. function 命令
dash shell不支持 function 语句。在dash shell中,你必须用函数名和圆括号定义函数:
func1()
echo "This is an example of a function"
zsh shell
zsh shell提供了一组核心内建命令,并提供了添加额外命令模块(command module)的能力。
zsh shell 的组成
shell 选项
zsh shell命令行参数
参 数 描 述
-c 只执行指定的命令,然后退出
-i 作为交互式shell启动,提供一个命令行交互提示符
-s 强制shell从 STDIN 读取命令
-o 指定命令行选项
-o 参数有些容易让人误解。它允许你设置shell选项来定义shell的功能。到目前为止,zsh shell是所有shell中可定制性最强的
内建命令
1. 核心内建命令
zsh核心内建命令
命 令 描 述
alias 为命令和参数定义一个替代性名称
autoload 将shell函数预加载到内存中以便快速访问
bg 以后台模式执行一个作业
bindkey 将组合键和命令绑定到一起
builtin 执行指定的内建命令而不是同样名称的可执行文件
bye 跟 exit 相同
cd 切换当前工作目录
chdir 切换当前工作目录
command 将指定命令当作外部文件执行而不是函数或内建命令
declare 设置变量的数据类型(同 typeset )
dirs 显示目录栈的内容
disable 临时禁用指定的散列表元素
disown 从作业表中移除指定的作业
echo 显示变量和文本
emulate 用zsh来模拟另一个shell,比如Bourne、Korn或C shell
enable 使能指定的散列表元素
eval 在当前shell进程中执行指定的命令和参数
exec 执行指定的命令和参数来替换当前shell进程
exit 退出shell并返回指定的退出状态码。如果没有指定,使用最后一条命令的退出状态码
export 允许在子shell进程中使用指定的环境变量名及其值
false 返回退出状态码 1
fc 从历史记录中选择某范围内的命令
fg 以前台模式执行指定的作业
float 将指定变量设为保存浮点值的变量
functions 将指定名称设为函数
getln 从缓冲栈中读取下一个值并将其放到指定变量中
getopts 提取命令行参数中的下一个有效选项并将它放到指定变量中
hash 直接修改命令哈希表的内容
history 列出历史记录文件中的命令
integer 将指定变量设为整数类型
jobs 列出指定作业的信息,或分配给shell进程的所有作业
kill 向指定进程或作业发送信号(默认为 SIGTERM )
let 执行算术运算并将结果赋给一个变量
limit 设置或显示资源限制
local 为指定变量设置数据属性
log 显示受 watch 参数 ① 影响的当前登录到系统上的所有用户
logout 同 exit ,但只在shell是登录shell时有效
popd 从目录栈中删除下一项
print 显示变量和文本
printf 用C风格的格式字符串来显示变量和文本
pushd 改变当前工作目录,并将上一个目录放到目录栈中
pushln 将指定参数放到编辑缓冲栈中
pwd 显示当前工作目录的完整路径名
read 读取一行,并用 IFS 变量将数据字段赋给指定变量
readonly 将值赋给不能修改的变量
rehash 重建命令散列表
set 为shell设置选项或位置参数
setopt 为shell设置选项
shift 读取并删除第一个位置参数,然后将剩余的参数向前移动一个位置
source 找到指定文件并将其内容复制到当前位置
suspend 挂起shell的执行,直到它收到 SIGCONT 信号
test 如果指定条件为 TRUE 的话,返回退出状态码 0
times 显示当前shell以及shell中所有运行进程的累计用户时间和系统时间
trap 阻断指定信号从而让shell无法处理,如果收到信号则执行指定命令
true 返回退出状态码 0
ttyctl 锁定和解锁显示
type 显示shell会如何解释指定的命令
typeset 设置或显示变量的特性
ulimit 设置或显示shell或shell中运行进程的资源限制
umask 设置或显示创建文件和目录的默认权限
unalias 删除指定的命令别名
unfunction 删除指定的已定义函数
unhash 删除散列表中的指定命令
unlimit 取消指定的资源限制
unset 删除指定的变量特性
unsetopt 删除指定的shell选项
wait 等待指定的作业或进程完成
whence 显示指定命令会如何被shell解释
where 如果shell找到的话,显示指定命令的路径名
which 用csh风格的输出显示指定命令的路径名
zcompile 编辑指定的函数或脚本,加速自动加载
zmodload 对可加载zsh模块执行特定操作
2. 附加模块
模 块 描 述
zsh/datetime 额外的日期和时间命令及变量
zsh/files 基本的文件处理命令
zsh/mapfile 通过关联数组来访问外部文件
zsh/mathfunc 额外的科学函数
zsh/pcre 扩展的正则表达式库
zsh/net/socket Unix域套接字支持
zsh/stat 访问stat系统调用来提供系统的统计状况
zsh/system 访问各种底层系统功能的接口
zsh/net/tcp 访问TCP套接字
zsh/zftp 专用FTP客户端命令
zsh/zselect 阻塞,直到文件描述符就绪才返回
zsh/zutil 各种shell实用工具
3. 查看、添加和删除模块
zmodload 命令是zsh模块的管理接口。通常习惯将 zmodload 命令放进$HOME/.zshrc启动文件中,这样在zsh启动时常用的函数就会自动加载。
zmodload 命令不加任何参数会显示zsh shell中当前已安装的模块。
% zmodload
zsh/zutil
zsh/complete
zsh/main
zsh/terminfo
zsh/zle
zsh/parameter
% zmodload zsh/zftp -- 在 zmodload 命令行上指定模块名称,添加新模块 zsh/zftp。加载成功不会显示信息。
% zmodload -u zsh/zftp -- 要删除已安装的模块,用 -u 参数和模块名。
zsh 脚本编程
数学运算
1. 执行计算
sh shell提供了执行数学运算的两种方法:
①let 命令
②双圆括号
% let value1=" 4 * 5.1 / 3.2 " -- 在使用 let 命令时,你应该在算式前后加上双引号,这样才能使用空格
% echo $value1
6.3750000000
% printf "%6.3f\n" $value1 -- 使用浮点数会带来精度问题。为了解决这个问题,通常要使用 printf 命令,并指定能正确显示结果所需的小数点精度
6.375
% value1=$(( 4 * 5.1 )) -- 使用双圆括号
% (( value2 = 4 * 5.1 ))
% printf "%6.3f\n" $value1 $value2
20.400
20.400
2. 数学函数
如果安装了 zsh/mathfunc 模块,你就会拥有远远超出你可能需要的数学函数
% value1=$(( sqrt(9) ))
zsh: unknown function: sqrt
% zmodload zsh/mathfunc
% value1=$(( sqrt(9) ))
% echo $value1
3.
结构化命令
zsh shell为shell脚本提供了常用的结构化命令:
if-then-else 语句
for 循环(包括C语言风格的)
while 循环
until 循环
select 语句
case 语句
zsh中的每个结构化命令采用的语法都跟你熟悉的bash shell中的一样。zsh shell还包含了另外一个叫作 repeat 的结构化命令
repeat 命令:
repeat param -- param 参数必须是一个数字或能算出一个数值的数学算式
do
commands
done
% cat test1
#!/bin/zsh
# using the repeat command
value1=$(( 10 / 2 )) -- 值为5,执行5次
repeat $value1
do
echo "This is a test"
done
$ ./test1
This is a test
This is a test
This is a test
This is a test
This is a test
函数
zsh shell支持使用 function 命令或通用圆括号定义函数名的方式来创建自定义函数
% function functest1
> echo "This is the test1 function"
% functest2()
> echo "This is the test2 function"
% functest1
This is the test1 function
% functest2
This is the test2 function
以上是关于shell: bash和dash的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu下把缺省的dash shell修改为bash shell