【linux】shell常用命令

日期 date命令

最快速的掌握方式,就是通过help命令,查看date的命令

$ date --help
Usage: date [OPTION]... [+FORMAT]
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.

Mandatory arguments to long options are mandatory for short options too.
  -d, --date=STRING          display time described by STRING, not 'now'
      --debug                annotate the parsed date,
                              and warn about questionable usage to stderr
  -f, --file=DATEFILE        like --date; once for each line of DATEFILE
  -I[FMT], --iso-8601[=FMT]  output date/time in ISO 8601 format.
                               FMT='date' for date only (the default),
                               'hours', 'minutes', 'seconds', or 'ns'
                               for date and time to the indicated precision.
                               Example: 2006-08-14T02:34:56-06:00
  -R, --rfc-email            output date and time in RFC 5322 format.
                               Example: Mon, 14 Aug 2006 02:34:56 -0600
      --rfc-3339=FMT         output date/time in RFC 3339 format.
                               FMT='date', 'seconds', or 'ns'
                               for date and time to the indicated precision.
                               Example: 2006-08-14 02:34:56-06:00
  -r, --reference=FILE       display the last modification time of FILE
  -s, --set=STRING           set time described by STRING
  -u, --utc, --universal     print or set Coordinated Universal Time (UTC)
      --help     display this help and exit
      --version  output version information and exit

  • 直接在linux环境输入date,显示当前日期
[bidata@tomcat03 ~]$ date
Mon Sep 27 17:34:13 CST 2021
#展示不同日期格式,加入+%
[bidata@tomcat03 ~]$ date +%Y%m%d
20210927
  • 不同格式对应结果
格式输出示例解释
+%Y%m%d20210927
+%F2021-09-27
+%s20210927时间戳
+%y21保留年后两位
+%M39分钟
+%H小时
+%S
+%Y%-m20219'-'去除前面0
  • 附录help命令补充的所有日期格式
FORMAT controls the output.  Interpreted sequences are:

  %%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   locale's full weekday name (e.g., Sunday)
  %b   locale's abbreviated month name (e.g., Jan)
  %B   locale's full month name (e.g., January)
  %c   locale's date and time (e.g., Thu Mar  3 23:05:25 2005)
  %C   century; like %Y, except omit last two digits (e.g., 20)
  %d   day of month (e.g., 01)
  %D   date; same as %m/%d/%y
  %e   day of month, space padded; same as %_d
  %F   full date; like %+4Y-%m-%d
  %g   last two digits of year of ISO week number (see %G)
  %G   year of ISO week number (see %V); normally useful only with %V
  %h   same as %b
  %H   hour (00..23)
  %I   hour (01..12)
  %j   day of year (001..366)
  %k   hour, space padded ( 0..23); same as %_H
  %l   hour, space padded ( 1..12); same as %_I
  %m   month (01..12)
  %M   minute (00..59)
  %n   a newline
  %N   nanoseconds (000000000..999999999)
  %p   locale's equivalent of either AM or PM; blank if not known
  %P   like %p, but lower case
  %q   quarter of year (1..4)
  %r   locale's 12-hour clock time (e.g., 11:11:04 PM)
  %R   24-hour hour and minute; same as %H:%M
  %s   seconds since 1970-01-01 00:00:00 UTC
  %S   second (00..60)
  %t   a tab
  %T   time; same as %H:%M:%S
  %u   day of week (1..7); 1 is Monday
  %U   week number of year, with Sunday as first day of week (00..53)
  %V   ISO week number, with Monday as first day of week (01..53)
  %w   day of week (0..6); 0 is Sunday
  %W   week number of year, with Monday as first day of week (00..53)
  %x   locale's date representation (e.g., 12/31/99)
  %X   locale's time representation (e.g., 23:13:48)
  %y   last two digits of year (00..99)
  %Y   year
  %z   +hhmm numeric time zone (e.g., -0400)
  %:z  +hh:mm numeric time zone (e.g., -04:00)
  %::z  +hh:mm:ss numeric time zone (e.g., -04:00:00)
  %:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)
  %Z   alphabetic time zone abbreviation (e.g., EDT)

By default, date pads numeric fields with zeroes.
The following optional flags may follow '%':

  -  (hyphen) do not pad the field
  _  (underscore) pad with spaces
  0  (zero) pad with zeros
  +  pad with zeros, and put '+' before future years with >4 digits
  ^  use upper case if possible
  #  use opposite case if possible

  • 直接输出cal,展示日历,并高亮显示当前日期
[bidata@tomcat03 ~]$ cal
   September 2021   
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

  • 日期加减-d

'-d’命令是日期的常用加减方式

admin@admin-PC MINGW64 ~/Desktop
$ date -d '-1day' +%Y%m%d
20210926
#与上面命令相同含义
$ date -d '1 days ago' +%Y%m%d
20210926
#指定日期的前一天
$ date -d '1 days ago 20210926' +%Y%m%d
20210925
#前一个月
$ date -d '-1month' +%Y%m%d
20210827

命令输出说明
-1day20210926前一天,等价于1 days ago
-1month20210827上个月

引号

  • 单引号与双引号

两者都表示字符串

单引号与双引号的区别:单引号直接引用字符串内容,双引号对字符串进行解释,举例如下:

$ a='1';b='$a'+'b';echo $b
$a+b

$ a='1';b="$a"+'b';echo $b
1+b

因此字符串中有引用其他变量,用双引号,不希望引用则用单引号。

变量赋值

  • 直接赋值
$ a=1;echo $a
1
  • 命令输出赋值
    两种方式一种是``命令,一种是$()方式,第二种支持嵌套,第一种不支持。
stat_date="20210901"
day_time=`date -d "-0day ${stat_date}" +%Y-%m-%d`
echo $day_time

#运行以上shell
$ sh shell_test.sh
#结果如下
2021-09-01

注意:变量day_time将命令的结果作为值时,值时在当时定义变量时命令运行的结果,如果命令中有变量在后续发生改变,day_time也不会发生改变

变量引用

  • 直接引用
    通过$var_name的方式,以及${var_name}两种方式,两者等价,有括号变量名界限解释更清晰(推荐)

如变量赋值与echo打印

$ a=2;b=$a;echo ${b}
2

  • 间接引用
#通过双引号的解释引用
$ a="1";b=${a}+"b";echo ${b}
1+b

shell脚本换行

  • 命令单行

多行命令在一行展示,通过 ; 来分割。

  • 命令多行

多行命令直接回车,不需要像一般语言那样加分号结尾。

函数传参

  • 函数定义比较简单,通过function fun_name(){},可以定义一个函数,举例如下
#其中$1表示第一个参数
function test(){
    printf $1
}
  • 函数传参,函数参数通过$1、$2、$3…依次获取,参数之间默认通过空格分割,以上函数调用举例
[guest@hadoop03 root]$ cat test.sh 
function test(){
    printf $1
}

a="hello"
test $a
[guest@hadoop03 root]$ sh test.sh
hello

  • 由于参数传递通过空格分割,如果参数中包含空格,则可以把参数通过引号包裹,表示一个参数,举例如下
<!--只能打印出hello一个字符,因为认为yellow为第2个参数-->
[guest@hadoop03 root]$ cat test.sh 
function test(){
    printf $1
}

a="hello yellow"
test $a
[guest@hadoop03 root]$ sh test.sh
hello

<!--这样就可以输出完整的字符串了,同样对于多行字符变量一样生效-->
[guest@hadoop03 wyq]$ cat test.sh 
function test(){
    printf "$1" #这里也要加上引号哦,也是真个参数的意思
}

a="hello yellow"
test "$a"
[guest@hadoop03 wyq]$ sh test.sh 
hello yellow


<!--多行字符如下-->
[guest@hadoop03 wyq]$ cat test.sh 
function test(){
    printf "$1" #这里也要加上引号哦,也是真个参数的意思
}

a="hello
yellow"
test "$a"
[guest@hadoop03 wyq]$ sh test.sh 
hello
yellow

函数返回值获取

  • 函数可以通过return关键字显示的表示返回值,return返回的是数值类型,表示函数运行状态
#--------------------------shell脚本test.sh内容---------------------------
function fun(){
	echo "$1 $2"
	return 1
}
a="a"
b="b"
fun $a $b
#通过$?获取前面命令的运行状态,也就是函数fun中return定义的返回值
if [ $? -eq 1 ]; then
	echo 'ok'
fi

#--------------------------运行上面脚本结果 -------------------------------
$ sh test.sh
ok
  • 获取函数echo内容,有时候单一的return返回值并不够,想要获取函数返回的字符内容,那么通过定义变量为函数返回值的方式,获取内容,同上面的变量赋值中获取命令结果的方式
#--------------------------shell脚本test.sh内容---------------------------
function fun(){
	echo "$1 $2"
	return 1
}
a="a"
b="b"
#此处ff即为函数fun中echo返回字符内容
ff=`fun $a $b`
#通过$?获取前面命令的运行状态,也就是函数fun中return定义的返回值
if [ $? -eq 1 ]; then
	#通过函数状态判断是否打印变量ff的返回内容
	echo "fun:${ff}"
fi

#--------------------------运行上面脚本结果 ------------------------------- 
$ sh test.sh
fun:a b

多行字符串与文件按行循环读取

  • 想要对多行字符串进行解析,包括文件按行来读取,可以通过循环方式进行,循环包括for与while两种,举例如下
<!--读取多行字符串-->
a="jii
jill"
<!--for循环读取-->
for line in $a
do
    echo $line
done

<!--while通过管道的方式-->
echo $a |while read line
do
    echo $line
done

<!--读文件-->
<!--for循环读取-->
for line in `cat test.txt`
do
    echo $line
done

<!--while通过管道的方式-->
cat test.txt |while read line
do
    echo $line
done

<!--while通过文件重定向的方式-->
while read line
do
    echo $line
done < test.txt

以上可以实现多行字符与文件按行读取,但以下几种情况会遇到问题:

    • 当每行中包含空格时,for循环会按多行分割,而while不会,对于读取文件建议用while来读取
    • 如果依然想用for循环来读取,可以更改IFS变量,IFS代表shell的系统变量,对字符进行分割时默认是空格、tab、回车,采用只用回车的方式进行临时更改,任务完成再更改回默认的值,记得IFS一定要更改回来,否则影响shell的全局系统使用
<!--a的每行中包含空格-->
a="ji ji
jid ji"
IFS_old=$IFS      # 记录老的分隔符
IFS=$'\n'              # 以换行符作为分隔符
for line in ${a} 
do
    echo ${line}
done
IFS=$IFS_old # 记得一定要更改会原来的值
    • 用while的管道方式读取每行时,如果循环内涉及外部变量的更新,如将每行内容读到变量$a中时,在循环结束后,并不会更新,原因是管道相当于启动一个子shell进程,不会对当前进程的变量进行更改,所以建议读取文件用文件重定向的方式,对于字符串,则可以将字符串保存至临时文件后,再用文件重定向方式读取
newStr=""
echo "${a}" | while read line
do
    newStr=${newStr}${line}' '
    echo ${newSql} #这是是有更新的
    fi
done
echo ${newStr} #循环结束后,这是是空的,并不会更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值