shell


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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值