刘总的笔记小站

生活常识,娱乐搞笑,编程技巧,智能家居,深度学习,网络神经,数据挖掘

linux常用的bash语法和shell命令

windows和linux编写bash脚本的时候遇见条件,循环,语句遗忘时,都可以通过help for查询。


linux系统shell脚本bash语法

#!/bin/bash
country="China"
directory=`pwd`
unset directory
directory=$(pwd)
a=10
b=20
expr $a + $b
eval command-line
string="abcd"
echo ${#string} #length
echo ${string:1:2} #bc
basename /home/yin/1.txt #1.txt
dirname  /home/yin/1.txt #/home
printf "%s and %d \n" #and 0
printf '%d %s\n' 1 "abc"
printf "%s %s %s\n" a b c d e f g h i j
if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;
if [ $ab == $cd ]; then echo "ab  equal  cd"; else echo "ab unequal  cd"; fi
if [ "a" == "a" ]; then echo 'str are equal'; else echo 'str not equal' ; fi;
if [ 12 -eq 345 ]; then echo 'num are equal'; else echo 'num not equal' ; fi;
# num: -eq -ne -gt -lt -ge -le 
# str: == != > < -z string -n string
# -a:and -o:or !:not
# file: -e file -f file -d file -r file -w file -x file
 
for loop in 1 2 3 4 5 do echo "The value is: $loop" done
for FILE in $HOME/.bash* do   echo $FILE done
for(( i = 1; i <= 100; i = i + 2 ))  do let "sum += i"; done
while [ $COUNTER -lt 5 ]; do COUNTER=$(expr $COUNTER + 1); done
while((i<=5)); do echo $i let i++; done
a=10; function func() { local a=2; }; func; echo $a # 10
until [[ "$i" -gt 5 ]]; do let "i++"; break; done
select color in "red" "blue" "green" "white" "black"; do break; done
case value in
parten1)
    command1
    ;;
*)
    command1
    ;;
esac
function function_name () {
    list of commands
    [ return value ]
}
unset .f function_name

0,数组
#bash only support one v array start with zero
array_name=(value0 value1 value2 value3)
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
${array_name[index]}
values=${array_name[*]}
values=${array_name[@]}
length=${#array_name[@]}
length=${#array_name[*]}
set -- one two three  # setting $1 $2 $3
eval echo \${$n}
# cmd command1 && command1 || command3 & > 2>&1

1,路径
# shell long path declare -x PS1 \w
# shell short path declare -x PS1 \W

2,条件
if [ -d "/data/test" ];then echo "file exist" else echo "file none" fi
-e filename  如果 filename存在,则为真  [ -e /var/log/syslog ]
-d filename  如果 filename为目录,则为真  [ -d /tmp/mydir ]
-f filename  如果 filename为常规文件,则为真  [ -f /usr/bin/grep ]
-L filename  如果 filename为符号链接,则为真  [ -L /usr/bin/grep ]
-r filename  如果 filename可读,则为真  [ -r /var/log/syslog ]
-w filename  如果 filename可写,则为真  [ -w /var/mytmp.txt ]
-x filename  如果 filename可执行,则为真  [ -L /usr/bin/grep ]
filename1-nt filename2  如果 filename1比 filename2新,则为真
filename1-ot filename2  如果 filename1比 filename2旧,则为真

3,截取
从左向右截取最后一个string后的字符串${varible##*string}
从左向右截取第一个string后的字符串${varible#*string}
从右向左截取最后一个string后的字符串${varible%%string*}
从右向左截取第一个string后的字符串${varible%string*} #“*”只是一个通配符可以不要
${#string}$string的长度
${string:position}在$string中, 从位置$position开始提取子串
${string:position:length}在$string中, 从位置$position开始提取长度为$length的子串
${string#substring}从变量$string的开头, 删除最短匹配$substring的子串
${string##substring}从变量$string的开头, 删除最长匹配$substring的子串
${string%substring}从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring}从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement}使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement}使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement}如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement}如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

4,括号
linux bash [和[[ [是bash内置关键字语法命令,[[是shell的命令
单小括号()命令替换执行$(cmd) 初始化数组。如:array=(a b c d)
双小括号(( )) 表达式C运算用于求表达式的值,a=5; ((a++)) 可将 $a 置为6 //echo $((16#5f)) //即95
单中括号[]①bash 的内部命令,[和test等同,②字符串==和!=,整数-eq,-gt,不能使用>,<可转义用于字符串
单中括号[]中的逻辑与和逻辑或使用-a 和-o ,[ ab \< bc ],结果为真,
双中括号[[ ]] ①[[是 bash 程序语言的关键字,而非命令 支持逻辑运算和模式匹配
注意:使用[]和[[]]不要吝啬空格,每一项两边都要有空格,[[ 1 == 2 ]]//false,但[[ 1==2 ]] //true

5,引号
# 由单引号括起来的字符都作为普通字符出现
# 由双引号括起来的字符,除$\’”作为特殊功能并保留,其余字符仍作为普通字符对待
# 由反引号括起来的字符串被shell解释为命令行,推荐使用$()新的用法替代反引号

6,井号
# $? 上一个命令或者脚本的退出码
# $$ 上一个命令或者脚本的进程PID
# $# 传递给脚本或函数的参数个数
# $0 当前脚本的文件名
# $n 传递给脚本或函数的第n个参数
# $* 传递给脚本或函数的所有参数,退化引号空格分割 as.sh a "b c" # $* arg1=1 arg2=2 arg3=3
# $@ 传递给脚本或函数的所有参数,保留引号原始分割 as.sh a "b c" # $@ arg1=a arg2=b c

7,流程
# set -u 执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它
# set -x 默认情况下,脚本执行后,屏幕只显示运行结果,没有其他内容
# set -e 它使得脚本只要发生错误,就终止执行
# set -e 针对管道|会把最后一个管道返回值作为整个命令的返回时
# set -o pipefail 只要一个子命令失败,整个管道命令就失败,脚本就会终止执行
# command || exit 1 如果某个命令失败,往往需要脚本停止执行,防止错误累积
# command || true 如果某个命令返回非零并不代表失败,需要脚本继续执行,或者写作:
# set +e 
# command1 
# set -e
# submit: bash -euxo pipefail as.sh | set -euxo pipefail | set -eux ; set -o pipefail


0,sed command 常用操作

一,搜索
sed -n "/^\set.*/p" Des ktop/vimrc

二,删除
sed "/^\".*/d" Desktop/vimrc
sed "/^\set.*/d" Desktop/vimrc
sed -i "/^$/d" ~/.vimrc            #删除文件中的空行
sed -i "/^\s*$/d" ~/.vimrc                  #删除文件中的空格行

三,替换
sed -i "s/^[ \t]*//" ~/.vimrc       #搜索替换文件中行首的空格
sed -i "s/[ \t]*$//g" ~/.vimrc       #搜索替换文件中行末空格
sed -i "s/[[:space:]]//g" ~/.vimrc    #搜索替换文件中所有的空格
sed -i "s/[ \t]/,/g" ~/.vimrc       #把文件中空格变为‘,’

四,备注
mac下 sed -i 直接操作被禁止,出于安全策略提供备份文件机制
发现 -i 需要带一个字符串,用来备份源文件,这个字符串加在源文件名后面组成备份文件名
如果这个字符串长度为0,就是说是个空串则不备份。例如:
sed -i "" ’s/old/new/g’ Desktop/vimrc


1,grep awk command 常用操作

一,grep

grep -n est.txt         打印行号
grep -v est.txt         反向过滤
grep -e "\s*" est.txt   正则匹配
grep test ~/            搜索目录包含
grep -r test ~/         搜索目录不包含
grep -v '^\s*$' test.txt

二,awk
awk NF test.txt
awk '/./ {print}' file 或 awk '{if($0!=" ") print}'



2,unix获取当前shell脚本的所在路径

basedir=`cd \`dirname $0\`; pwd`
basepath=$(cd `dirname $0`; pwd)


3,linux mint 64位出现fatal error: stdio.h: 没有那个文件或目录

在32环境下一般不会出现这个问题,因为已经把libc的头文件包括在系统中了
build-essential package - Installs the following collection to compile c/c++ program on Debian/Ubuntu Linux:
sudo apt-get install  build-essential 
包含如下组件:
    libc6-dev - C standard library.
    gcc - C compiler.
    g++ - C++ compiler.
    make - GNU make utility to maintain groups of programs.
    dpkg-dev - Debian package development tools.
也可单独安装,即可满足使用:
sudo apt-get install libc6-dev


4,apache2和vsftpd配置

apache2
配置网站主页文件:/etc/apache2/mods-enabled/dir.conf
配置网站主页路径:/etc/apache2/sites-enabled/000-default.conf

vsftpd
vsftpd安装完毕之后不用任何配置即可用(debian 9至少是这样)
安装:apt-get install vsftpd
启动root登陆:vim /etc/ftpusers注释掉root即可。


nginx
vim /etc/nginx/sites-enabled/default 修改端口
vim /etc/nginx/sites-enabled/default  修改目录
vim /usr/share/nginx/html/index.html  修改首页
sudo netstat -anp | grep nginx 查看端口


5,查看防火墙状态防火墙未启动则不限制端口。

ufw status
ufw allow 80

ufw enable
ufw reload


6,查看端口占用

netstat -anp | grep 8080


7,查看进程

ps -ef
ps -ef | grep ftpServer
pkill ftpServer
kill -9 2345


8,Win下面编辑过shell脚本换行符变为\n\r,导致linux 执行脚本出错

bash: ./and.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录
bash: ./and.sh: /bin/bash^M: 解释器错误: 没有那个文件或目录
sed -i "s/\r$//" and.sh


9,显示换行符和行号

cat -A codefile
grep -n make
and@and-ThinkPad-T440s ~/as/and_h264_decode_encode $ ll
-rwxrwxr-x 1 and and    13864 8月   5 01:40 decoder.out*
第1列:第一个单词(文件类型【-为普通文件】【d为文件夹】)后面9位权限(rwx(当前用户)rwx(用户组)rwx(其他用户),如果没有此权限的话用-代替)
 第2列:(数量)
第3列:文件所有者
第4列:文件所属用户组(root属于root组)
第5列:文件大小


A,配置cntlm代理的命令:

sudo apt-get install cntlm
vim /etc/cntlm.conf
---
Proxy        xxx
Username     xxx
Domain       xxx
#Password    xxx
###Auth        
###PassNT      
###PassLM      
NoProxy      xxx
Listen       xxx
Gateway      xxx
---

cntlm -c "/etc/cntlm.conf" -I -M www.liuzong.org

通过账号域名和密码验证之后,会生成正确认###字段三项更新到配置文件即可。
chrome浏览器通过SwitchyOmega和SwitchySharp配置代理ip和port即可愉快上网。


B,交互命令自动化执行

#!/usr/bin/env expect 

# set timeout 30
set timeout -1

spawn tar -czvf $(date +'%Y-%m-%d_%H-%M-%S').tar.gz ./data

spawn ftp $srcAtIpAd
expect "Name (" { send "$srcAtUser\r" }
expect "Password:" { send "$srcAtPswd\r" }
expect "*Remote*"
send "pwd \r"
send "binary \r"
send "get nullptr.cpp \r"
send "pwd \r"
send "exit\r"
expect eof

spawn ssh $buildUser@$buildIpAd
expect {
	"yes/no" { send "yes\r";exp_continue }
	"Password:" { send "$buildPswd\r" }
}
expect "*from*"
send "pwd \r"
send "source /etc/bashrc \r"
send "ps aux | grep vsftpd.conf | grep -v grep | wc -l |  awk '{if(\$1){print 1\"OK\"}else{print 0\"NG\"}}' \r"
expect {
	"1OK" { send "ps -aux | grep andr.vsftpd.conf\r"}
	"0NG" { send "/usr/sbin/ftpd /root/and/andr.vsftpd.conf & \r" }
}
send "exit\r"
expect eof

spawn scp "$buildUser@$buildIpAd:$buildPath/$buildLibs" "./"
expect {
        "yes/no" { send "yes\r";exp_continue }
        "Password:" { send "$buildPswd\r" }
}
send "exit\r"
expect eof




发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
搜索
«   2024年9月   »
1
2345678
9101112131415
16171819202122
23242526272829
30
网站分类
最新留言
文章归档
网站收藏
友情链接
图标汇集
Powered by Z-BlogPHP

  • Copyright ©2021 @liuzong All rights reserved.
  • 陕ICP备17016542号