shell
set nu / nonu
o -->new line
yy copy whole line
y0
y$
r -->replace a char
x delete a char
dd delete whole line
d0
d$
p paste
u--> undo
[Ctrl]+r
. repeat do.
whoami 查看当前登录用户名
cat /etc/passwd 可以查看系统所有的用户
===========shell===========
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
/bin/sh test.sh
删除变量
使用 unset 命令可以删除变量。语法:
unset variable_nam
string="abcd"
echo ${#string} #输出 4
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
============字符串==========
#、## 表示从左边开始删除。一个 # 表示从左边删除到第一个指定的字符;两个 # 表示从左边删除到最后一个指定的字符。
%、%% 表示从右边开始删除。一个 % 表示从右边删除到第一个指定的字符;两个 % 表示从左边删除到最后一个指定的字符。
删除包括了指定的字符本身
#!/bin/bash
# 字符串截取(界定字符本身也会被删除)
str="www.runoob.com/linux/linux-shell-variable.html"
echo "str : ${str}"
echo "str#*/ : ${str#*/}" # 从 字符串开头 删除到 左数第一个'/'
echo "str##*/ : ${str##*/}" # 从 字符串开头 删除到 左数最后一个'/'
echo "str%/* : ${str%/*}" # 从 字符串末尾 删除到 右数第一个'/'
echo "str%%/* : ${str%%/*}" # 从 字符串末尾 删除到 右数最后一个'/'
echo
echo "str#/* : ${str#/*}" # 无效果
echo "str##/* : ${str##/*}" # 无效果
echo "str%*/ : ${str%*/}" # 无效果
echo "str%%*/ : ${str%%*/}" # 无效果
============字符串==========
数组
${数组名[下标]}
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
注释
#
多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
以下实例读取键盘输入的内容并将其赋值给shell变量,为:-p 参数由于设置提示信息:
read -p "input a val:" a #获取键盘输入的 a 变量数字
read -p "input b val:" b #获取键盘输入的 b 变量数字
r=$[a+b] #计算a+b的结果 赋值给r 不能有空格
echo "result = ${r}" #输出显示结果 r
测试结果:
input a val:1
input b val:2
result = 3
shell传参数
可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,
1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,
则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试:
算术比较, 比如一个变量是否为0, [ $var -eq 0 ]。
文件属性测试,比如一个文件是否存在,[ -e $var ], 是否是目录,[ -d $var ]。
字符串比较, 比如两个字符串是否相同, [[ $var1 = $var2 ]]。
可以通过 -a (and) 或 -o (or) 结合多个条件进行测试:
[ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ] # 使用逻辑或 -o
文件属性测试
[ -f $file_var ] 变量 $file_var 是一个正常的文件路径或文件名 (file),则返回真
[ -x $var ] 变量 $var 包含的文件可执行 (execute),则返回真
[ -d $var ] 变量 $var 包含的文件是目录 (directory),则返回真
[ -e $var ] 变量 $var 包含的文件存在 (exist),则返回真
[ -c $var ] 变量 $var 包含的文件是一个字符设备文件的路径 (character),则返回真
[ -b $var ] 变量 $var 包含的文件是一个块设备文件的路径 (block),则返回真
[ -w $var ] 变量 $var 包含的文件可写(write),则返回真
[ -r $var ] 变量 $var 包含的文件可读 (read),则返回真
[ -L $var ] 变量 $var 包含是一个符号链接 (link),则返回真
文件比较符
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ]
在进行字符串比较时,最好使用双中括号 [[ ]].
[[ $str1 = $str2 ]] 或者 [[ $str1 == $str2 ]]
[[ $str1 != $str2 ]] 如果 str1 与 str2 不相同,则返回真
[[ -z $str1 ]] 如果 str1 是空字符串,则返回真
[[ -n $str1 ]] 如果 str1 是非空字符串,则返回真
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n "$a" ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
推荐用 $() 代替 ``:
val=`expr 10 + 20`
val=$(expr 10 + 20)
echo
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
echo -e "OK! \n" # -e 开启转义
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo '$name\"' #原样输出
> 重定向输出到某个位置,替换原有文件的所有内容。
>> 重定向追加到某个位置,在原有文件的末尾添加内容。
< 重定向输入某个位置文件。
2> 重定向错误输出。
2>> 重定向错误追加输出到文件末尾。
&> 混合输出错误的和正确的都输出。
read -p "请输入一段文字:" -n 6 -t 5 -s password
echo -e "\npassword is $password"
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;
$ command > /dev/null
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF
执行以上脚本,输出结果:
欢迎来到
菜鸟教程
www.runoob.com
==========printf===========
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
==========printf===========
函数
函数返回值在调用该函数后通过 $? 来获得。
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
=======文件包含:=======
创建两个 shell 脚本文件。
test1.sh 代码如下:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
url="http://www.runoob.com"
test2.sh 代码如下:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "菜鸟教程官网地址:$url"
shell跟踪
sh -x yourshell
-x参数是显示过程
cat > trace1.sh
#! /bin/sh
set -x #打开跟踪功能
echo 1st echo #做些事
set +x #关闭跟踪功能
echo 2nd echo #再做些事
^D #以end-of-file结尾
shell debug
Shell脚本调试选项
Shell本身提供一些调试方法选项:
-n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。
-v,一边执行脚本,一边将执行过的脚本命令打印到标准输出。
-x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
使用这些选项有三种方法(注意:避免几种调试选项混用)
1.在命令行提供参数:$sh -x script.sh
2.脚本开头提供参数:#!/bin/sh -x
3.在脚本中用set命令启用or禁用参数:其中set -x表示启用,set +x表示禁用。
https://www.cnblogs.com/anliven/p/6032081.html
查看bash版本
[root]# rpm -q bash
一、bashdb 安装
1、下载
先确定你的bash 版本
bash --version
If your version of bash is 4.3 or higher, use folder 4.3-0-91
If your version of bash is 4.2 or higher, use folder 4.2-0.8
If your version of bash is 4.1 or higher but less than 4.2 use folder 4.1-0.5
If your version of bash is 4.0 or higher but less than 4.1 use folder 4.0-0.4
If your version of bash is 3.1 or higher and less than 4.0, use folder 3.1-0.09.
If your version of bash is 3.0 or higher but less than 3.1, use the folder 3.00-0.05.
wget https://sourceforge.net/projects ... shdb-4.1-0.5.tar.gz
2、编译
#tar zxvf bashdb-4.1-0.5.tar.gz
#cd bashdb-4.1-0.5
#./configure
#make && make install
使用bashdb
https://www.iyunv.com/thread-350671-1-1.html
[root]#bash --debugger yourscript.sh var1 var2
[root]#bashdb -n yourscript.sh var1 var2 # its work.
1
一些常用的调试方法
run 运行
R 重启
l m n 列出m到n行之间的代码
b n 在第n行设断点
L 列出所有断点
d n 删除第n行的断点
D 删除所有断点
W var 观察var
n 单步执行
s 单步执行,进入函数
print $var显示var,观察用,用得最多的命令
T 观察栈
skip 跳过要执行的命令
ret 执行完到函数返回
finish 执行到程序结束
a n cmd 在第n行执行cmd命令行为
A 取消所有添加的行为
q 退出调试
vailable commands:
action condition edit frame load run source unalias
alias continue enable handle next search step undisplay
backtrace debug eval help print set step- untrace
break delete examine history pwd shell step+ up
clear disable export info quit show tbreak watch
commands display file kill return signal trace watche
complete down finish list reverse skip tty
http://bashdb.sourceforge.net/bashdb.html
集成到vim
wget -O bash-support.zip http://www.vim.org/scripts/download_script.php?src_id=9890
unzip /usr/src/bash-support.zip
Add the following line to the ~/.vimrc to enable the plugin for Vim editor.
把下列行添加到~/.vimrc文件来启动这个Vim编辑器的插件。
[root]#vim ~/.vimrc
filetype plugin on
===========shell===========
Linux查看当前目录下文件名中包含指定字符的文件
find . -type f -name "edaijia*
linux 查找软件安装位置
whereis 通过程序名字搜索程序安装位置
在某个目录下查看含有某个字段的文件
find . -name "*.php" | xargs grep "hello"
只查看文件, 不查看目录
find . -type f | xargs grep "custom'
grep 提供了-l来只显示文件名称
find . -type f | xargs grep "custom' -l
过滤掉某些文件夹
find . -path ./.目录 -prune -o -type f | xargs grep "custom" -l
https://www.cnblogs.com/dereckbu/p/8916718.html
Linux查找含有某字符串的所有文件并显示所在行号
如果你想在当前目录下 查找"hello,world!"字符串,可以这样:
grep -rn "hello,world!" *
在指定的文件中查找
grep -rn "hello,world!" filename