linux shell记录

#-------- 《一》 变量定义
sex="boy"
result=$[1+2]  #[]可以对变量输出 也可以进行数学运算 比如 a=1 b=2 echo[b]结果为2 echo $[a+b] 结果为3
echo $sex;
echo ${sex}    # {}用于获取变量的值输出 可以进行截取操作 不能进行数学运算
echo `wc -l ~/.bash_profile`
rowcount=`wc -l ~/.bash_profile`
rowcount=$(wc -l ~/.bash_profile) #两句是等价的 $()和``中都可以执行命令
#数字变量操作
i=1
i=i+1  #这里i不是等于2 i就是等于字符串的"i+1" 所以要进行数学运算有几种方式
#下面三种方式 都可以实现 i++
i=$[i+1]
let i=i+1  #或者 let i++
((i++)

#双引号使用的变量 可以直接解析
jiaozi="i am a ${sex}";
#单引号所有内容不解析
cherry='i am a ${sex}';
echo $jiaozi;
echo $cherry;

#--------《二》字符串处理
#1>返回总长度 ``执行字符串中的命令 
echo ${#cherry}
echo `expr length 123`
#2>截取字符串 表示从1开始的2个长度
echo ${jiaozi:1:2}
echo `expr substr "abc" 1 2`
#3>获取一个字符串b在另一个字符串abc中的的位置 索引从1开始
echo `expr index abc b`
#4>切割字符串  比如通过 :切割 abc:bcd
echo abc:bcd | cut -d: -f1  #这里 -d后面表示切割的符号  -f1表示输出第一个切割的字符 这里就是abc 如果是f2就是bcd
#5>去除空格  echo自带去空格功能
echo `"echo test   "`
#6>转换大写  输出BCD
 echo bcd | tr '[a-z]' '[A-Z]'
#7>转换小写  输出bcd
[root@bogon shell]# echo bcD | tr 'A-Z' 'a-z'
#8替换字符串 定义一个变量  将test变量的值中的yy替换成p
test="abyyef"||echo ${test/yy/p}

#--------《三》类型转换
#1数字 4舍五入
  num=12.456
  printf "%4.2f\n" ${num}  #保留4位 2位小数
  fnum=`printf "%4.2f" ${num}`  #结果写入变量fnum
#2 日期格式化
  date "+%Y-%m-%d %H:%M:%S"
  curTime=`date "+%Y-%m-%d %H:%M:%S"`

#--------《四》数组
arr=(1 2 3 4 bcd)  #初始化数组 数组是自动扩容的
arr[1]=3
arr[b]=234  #键可以是字符串也可以是数字 类似java的map类型
echo ${arr[1]}  #输出内容
echo ${#arr[*]}  #获取数组的长度
echo `expr 2 + 3`

#--------《五》流程控制
#1>if语句
a=10
mysex="男"
# -a表示逻辑与  -o表示逻辑或 !表示非  数字的比较 -eq相等 -gt大于 -lt小于 字符串比较相等 = 或者 !=
# []中间的每一个符号和单词都需要有一个空格不然报错 then放在写一行 如果需要在同一行 带一个;  比如;then
if [ $mysex = "男" -a ! $a -gt 20 ]
then
  echo "没钱男性同胞"
fi
#文件的检测 -r 可读  -w 可写 -x 可执行  -e表示是否存在文件
file="/root/shell/var.sh"
if [ -r $file -a -w $file ] 
then
 echo "文件是可读的"
fi

if test -w $file 
then
  echo "文件是可写的"
fi
#---------- if和 elif 和else的用法  test和[]用法是一致的  case的用法参考《六》方法章节
sex=1
if test $[sex] -eq 0
then
  echo "man"
elif test ${sex} -eq 1
then
 echo "woman"
else
 echo "nosex"
fi
#1>循环语句
#-for循环 
for t in 1 2 3 4
do
 echo $t
done

#-while循环
i=1
while(( $i<=10 ))
do
  echo $i
  let i++  #或者 let i=i+1
done

#--------《六》方法
start(){
  echo "hello function"
}
start  #表示调用一个没有参数和返回值的方法
#$1表示第一个参数 $n表示第n个参数
add(){
  let i=$1+$2
  echo "参数的个数为 : $#"
  case $# in
    1) echo "参数个数少于2个"
    ;;
    2) echo "参数个数正确"
    ;;
  esac


  echo "当前进程编号  $$"

  return $i
}
add 23 45
# $?表示返回值
echo "结果为:$?"

#--------《七》流输入和输出(文件操作)
#控制台输入值到mysex变量
read mysex 
# command > 文件 将命令输出的内容重定向到文件中 控制台不在输出  >覆盖文件 >>追加内容不覆盖
ifconfig > /my.log
ifconfig >> /my.log
# command <文件 读取文件的内容给命令处理 
wc -l < /my.log
#如果希望控制台和文件都不输出
echo 'a'>/dev/null
#循环读取每一行 for循环 按照空格切分来读 不是每行读取一次
 for i in `cat /my.log`
 do
   echo $i
 done
#read直接从 <定向流或者cat结果中读取数据 
 while read pline
 do
   echo $pline
 done < /my.log

 cat /my.log | 
  while read pline
  do
    echo $pline
  done 

#--------《八》定时调度(多线程)
创建 cron文件
 vi my.cron      #文件中写入下面的内容
 */1 * * * * echo aa >> /my.log  #每1分钟执行此后面的echo命令
 crontab ./my.cron #读取文件 自动开启该脚本执行  
 crontab -l  #显示所有的执行的任务
 crontab -r # 删除所有的定时任务
 # cron文件的时间的解释
 #  分钟 小时 天 月份 星期 命令  
 #  合法值为:00-59 00-23 01-31 01-12 0-6 (0是周日) 
 #  除了数字还有几个特殊的符号:"*"、"/"和"-"、","
 #  *代表所有的取值范围内的数字
 #  "/"代表每的意思,"/5"表示每5个单位
 #  "-"代表从某个数字到某个数字
 #  ","分开几个离散的数字
 #  比如
 #   */1 12-24 * * * #表示每分钟都会执行 12-24只有每天下午 12点到晚上24点  合并就是每天的12-24点的每一分钟都执行一次
 #   *代表所有的时间范围 可以用-指定范围

#--------《九》网络请求
 wget用于发送请求获取结果
   -d 打印调试信息 包括请求头和响应头都会输出
   -spider 不输出到文件中
   --header 设置请求头
   wget -S --spider  https://www.baidu.com/
   wget -S --spider --header="User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 

Chrome/50.0.2661.102 Safari/537.36"  http://blog.csdn.net/xifeijian/article/details/9399121
 获取网页内容 使用命令  curl ip或者域名  比如 curl www.baidu.com
 
#--------使用shell命令添加window服务
写一个java的main方法程序 main方法发布一个webservice 上传到linux后 需要
 通过 service myjar start 启动该jar包服务

#--------《十》实战
#-使用shell命令添加window服务写一个java的main方法程序 main方法发布一个webservice 上传到linux后 需要 通过 service myjar start 启

动该jar包服务
#linux的 /etc/init.d下面创建文件 myjar 添加以下内容 假设java代码打jar包为w.jar 上传到/root/shell目录
package cn.et.wbe;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;


@WebService
public class TestWeb {
	@WebMethod
	public int add(int p1,int p2){
		return p1+p2;
	}
	public static void main(String[] args) {
		Endpoint.publish("http://192.168.58.132:8888/test?wsdl", new TestWeb());//这里linux服务器的ip是192.168.58.132

	}
}
myjar 文件的内容为
appDir="/root/shell"
start(){
 if test -e $appDir/w.id
 then
   echo "服务已启动 请使用restart命令"
   return
 fi
 java -jar $appDir/w.jar >> $appDir/w.out&
 #通过ps -ef找到java命令 空格切割第二个就是进程号
 pid=`echo \`ps -ef | grep java\` | cut -d" " -f2` 
 echo $pid>$appDir/w.id 
}
stop(){
 pid=`cat $appDir/w.id`
 if test ! -e $appDir/w.id
 then
   echo "服务没有启动"
   return
 fi
 kill $pid
 rm -rf $appDir/w.id
}
restart(){
 return
}
status(){
if test -e $appDir/w.id
 then
   echo "已启动"
 else
   echo "已关闭"
 fi
}
case $1 in
 start)
  start
;;
 stop)
  stop
;;
 restart)
  restart
;;
 status)
  status
;;
esac

将服务添加到系统服务 在开机后自动启动
在myjar文件最上面添加  表示在 2345运行级别都可以运行 否则抛出service myjar does not support chkconfig
#chkconfig: 2345 10 90
#description: Jiaozi Server


chkconfig -add myjar #添加到系统服务
chkconfig myjar on  #开机启动
chkconfig --list 查看所有系统服务列表
可以看到 1-6级别下是否会自动启动 myjar文件开头是2345
myjar           0:off   1:off   2:on    3:on    4:on    5:on    6:off

其他命令总结

1》awk命令

   awk用于文件的统计 通过文件换行为切割符 将文件切换为多行后  每行执行自定义的awk脚本语句处理  awk脚本类似于一个脚本语言  支持变量定义 流程控制等  每一行也可以使用 -F指定切割符 来切割 $0表示当前行的所有数据  $1表示第一个切割的字符串 比如:

 查看正在运行所有sbin目录下可执行程序

 

[root@ha1 /]# ps -ef | grep sbin
root         1     0  0 06:02 ?        00:00:01 /sbin/init
root       497     1  0 06:02 ?        00:00:00 /sbin/udevd -d
root      1200     1  0 06:03 ?        00:00:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth1.leases -pf /var/run/dhclient-eth1.pid eth1
root      1286     1  0 06:03 ?        00:00:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
root      1352     1  0 06:03 ?        00:00:00 /usr/sbin/sshd
root      1473     1  0 06:03 tty2     00:00:00 /sbin/mingetty /dev/tty2
root      1475     1  0 06:03 tty3     00:00:00 /sbin/mingetty /dev/tty3
root      1477     1  0 06:03 tty4     00:00:00 /sbin/mingetty /dev/tty4
root      1479     1  0 06:03 tty5     00:00:00 /sbin/mingetty /dev/tty5
root      1486   497  0 06:03 ?        00:00:00 /sbin/udevd -d
root      1487   497  0 06:03 ?        00:00:00 /sbin/udevd -d
root      1488     1  0 06:03 tty6     00:00:00 /sbin/mingetty /dev/tty6
root      2234  1701  0 07:40 pts/1    00:00:00 grep sbin

awk默认的列分隔符 就是 \t也就是tab制表符 比如需要输出进程编号和执行文件路径

 

 

[root@ha1 /]# ps -ef | grep sbin | awk '{print $2 "\t" $8}'
1       /sbin/init
497     /sbin/udevd
1200    /sbin/dhclient
1286    /sbin/rsyslogd
1352    /usr/sbin/sshd
1473    /sbin/mingetty
1475    /sbin/mingetty
1477    /sbin/mingetty
1479    /sbin/mingetty
1486    /sbin/udevd
1487    /sbin/udevd
1488    /sbin/mingetty
2264    grep

awk的语法特征 所有代码块 在{}中 BEGIN{}表示循环之前  END{} 表示循环之后  比如这里统计sbin执行程序的总共个数

 

[root@ha1 /]# ps -ef | grep sbin | awk 'BEGIN { count=0 } {count=count+1} END {print count}'
13

awk中可以定义数组 执行循环等 

内置变量表

 

属性说明
$0当前记录(作为单个变量)
$1~$n当前记录的第n个字段,字段间由FS分隔
FS输入字段分隔符 默认是空格
NF当前记录中的字段个数,就是有多少列
NR已经读出的记录数,就是行号,从1开始
RS输入的记录他隔符默 认为换行符
OFS输出字段分隔符 默认也是空格
ORS输出的记录分隔符,默认为换行符
ARGC命令行参数个数
ARGV命令行参数数组
FILENAME当前输入文件的名字
IGNORECASE如果为真,则进行忽略大小写的匹配
ARGIND当前被处理文件的ARGV标志符
CONVFMT数字转换格式 %.6g
ENVIRONUNIX环境变量
ERRNOUNIX系统错误消息
FIELDWIDTHS输入字段宽度的空白分隔字符串
FNR当前记录数
OFMT数字的输出格式 %.6g
RSTART被匹配函数匹配的字符串首
RLENGTH被匹配函数匹配的字符串长度
SUBSEP\034

2》sed命令

 流式编辑器  可以动态替换文件内容 参考
 

 

http://www.runoob.com/linux/linux-comm-sed.html

3》Shell中的括号、双括号、方括号和双方括号

3.1》$( ) 与 ` ` (反引号)
 

在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的。
例如:

GVT@DESKTOP-V14R68B MINGW64 ~/Desktop
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
the last sunday is 2020-03-15

GVT@DESKTOP-V14R68B MINGW64 ~/Desktop
$ echo the last sunday is `date -d "last sunday" +%Y-%m-%d`
the last sunday is 2020-03-15

如此便可方便得到上一星期天的日期了… ^_^

用 $( ) 的理由:

1,   ` ` 很容易与 ' ' ( 单引号)搞混乱,尤其对初学者来说。
有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
当然了,有经验的朋友还是一眼就能分辩两者。只是,若能更好的避免混乱,又何乐不为呢? ^_^

2, 在多层次的复合替换中,` ` 须要额外的跳脱( \` )处理,而 $( ) 则比较直观。例如:
这是错的:

command1 `command2 `command3` `

原本的意图是要在 command2 `command3` 先将 command3 提换出来给 command 2 处理,
然后再将结果传给 command1 `command2 …` 来处理。
然而,真正的结果在命令行中却是分成了 `command2 ` 与 “ 两段。
正确的输入应该如下:

command1 `command2 \`command3\` `

要不然,换成 $( ) 就没问题了:

command1 $(command2 $(command3))

只要你喜欢,做多少层的替换都没问题啦~~~   ^_^

$( ) 的不足:
1. ` ` 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。
而 $( ) 并不见的每一种 shell 都能使用,我只能跟你说,若你用 bash2 的话,肯定没问题…   ^_^

3.2》${}

${ } 用来作变量替换。
一般情况下,$var 与 ${var} 并没有啥不一样。
但是用 ${ } 会比较精确的界定变量名称的范围,比方说:
$ A=B
$ echo $AB
原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,
但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来…
若使用 ${ } 就没问题了:
$ echo ${A}B

3.3》$(( )) 与(())
在 bash 中,$(( )) 的整数运算符号大致有这些:
+ - * / :分别为 "加、减、乘、除"。
% :余数运算
& | ^ !:分别为 "AND、OR、XOR、NOT" 运算。]=
例:

$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1

在 $(()) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的结果此外,$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算呢,只是,输出结果皆为十进制而已:
echo $((16#2a)) 结果为 42 (16进位转十进制)
以一个实用的例子来看看吧:
假如当前的   umask 是 022 ,那么新建文件的权限即为:
 

$ umask 022
$ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644

 

 

事实上,单纯用 (( )) 也可重定义变量值,或作 testing:
a=5; ((a++)) 可将 $a 重定义为 6 
a=5; ((a–)) 则为 a=4
a=5; b=7; ((a < b)) 会得到   0 (true) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于

3.4》条件判断中括号、双括号、方括号和双方括号

在Shell中,括号表示条件测试方法。主要用在if-then、case等需要条件判断的语句结构中

3.4.1》双括号

使用双括号,在比较过程中使用高级数学表达式

#!/bin/bash

val1=10
if(( $val1 ** 2 > 90 ))
then
    ((val2 = $val1 ** 2))
    echo "The square of $val1 is $val2"
fi

3.4.2》方括号

  • 方括号定义了测试条件,包括数字,字符,文件等比较。

  • 第一个方括号后和第二个方括号前都要加一个空格,否则会报错。

#!/bin/bash
# Using numeric test evaluations
value1=10
value2=11
#
if [ $value1 -gt 5 ]
then
    echo "The test value $value1 is greater than 5"
fi
#
if [ $value1 -eq $value2 ]
then
    echo "The values are equal"
else
    echo "The values are different"
fi
#

3.4.3》双方括号

  • 双方括号提供了字符串比较的高级特性。
  • 括号中可以定义一些正则表达式来匹配字符串
  • 注意不是所有的shell都支持双方括号!
$ cat test24.sh
#!/bin/bash

if [[ $USER == s* ]]
then
    echo "Hello Seal"
else
    echo "Sorry, I do not know you"
fi

# seal @ bogon in ~/Desktop/Shell [17:36:57]
$ ./test24.sh
Hello Seal

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值