1、shell相关命令
cat查看当前系统的可用shell :cat /etc/shells
查看当前系统默认shell: echo $SHELL
注:
Shell 通过PS1和PS2两个环境变量来控制提示符格式:
PS1 控制最外层命令行的提示符格式。
PS2 控制第二层命令行的提示符格式。
查看PS1 和 PS2:echo $PS1 或 echo $PS2
在 Shell 中初次输入命令,使用的是 PS1 指定的提示符格式;如果输入一个命令后还需要输入附加信息,Shell 就使用 PS2 指定的提示
例如:
[mozhiyan@localhost ~]$ echo "http://c.biancheng.net"
http://c.biancheng.net
[mozhiyan@localhost ~]$ echo "
> yan
> chang
> sheng
> "
yan
chang
sheng
[mozhiyan@localhost ~]$
//提示符可以包含的要素。特殊字符
\a 铃声字符
\d 格式为“日 月 年”的日期
\e ASCII转义字符
\h 本地主机名
\H 完全合格的限定域主机名
\j shell当前管理的作业数
\1 shell终端设备名的基本名称
\n ASCII换行字符
\r ASCII回车
\s shell的名称
\t 格式为“小时:分钟:秒”的24小时制的当前时间
\T 格式为“小时:分钟:秒”的12小时制的当前时间
\@ 格式为am/pm的12小时制的当前时间
\u 当前用户的用户名
\v bash shell的版本
\V bash shell的发布级别
\w 当前工作目录
\W 当前工作目录的基本名称
\! 该命令的bash shell历史数
\# 该命令的命令数量
\$ 如果是普通用户,则为美元符号$;如果超级用户(root 用户),则为井号#。
\nnn 对应于八进制值 nnn 的字符
\\ 斜杠
\[ 控制码序列的开头
\] 控制码序列的结尾
例如:
[mozhiyan@localhost ~]$ PS1="[\t][\u]\$ "
[17:27:34][mozhiyan]$
注:Shell 脚本中所有以#开头的都是注释(当然以#!开头的除外)
#!/bin/bash #注:#!是一个约定的标记,告诉系统脚本用什么解释器执行
echo "Hello World !" #注: echo 命令用于向标准输出文件
read PERSON #注:表示从终端读取用户输入的数据,并赋值给 PERSON 变量,read 命令用来从标准输
#入文件
echo "Hello, $PERSON"
#定义变量
#1、变量名由数字、字母、下划线组成
#2、必须以字母或者下划线开头
#3、不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)
variable=value
variable='value'
variable="value"
#注: 每一个变量的值都是字符串,这意味着shell 在默认情况下不会区分变量类型
#variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等)
#那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号
#是有区别的,1、以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令
#需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等
#的场景。2、以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命
#令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
author="严长生"
echo $author
echo ${author}
#注:变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界 如:
skill="Java"
echo "I am good at ${skill}Script"
#将命令的结果赋值给参数
variable=`command`
variable=$(command)
#第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,
#第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。例如:
$ log=$(cat log.txt)
$ echo $log
[2018-09-10 06:53:22] 严长生正在编写Shell教程
$ log=`cat log.txt`
$ echo $log
[2018-09-10 06:53:22] 严长生正在编写Shell教程
#变量作用于
#Shell 变量的作用域可以分为三种:
#1、有的变量可以在当前 Shell 会话中使用,这叫做全局变量(global variable);
#2、有的变量只能在函数内部使用,这叫做局部变量(local variable);
#3、而有的变量还可以在其它 Shell 中使用,这叫做环境变量(environment variable)。
#a.sh文件
#!/bin/bash
echo $a
b=200
#b.sh文件
#!/bin/bash
echo $b
#执行
$ a=99
$ . ./a.sh
99
$ . b.sh
200
$
#脚本中函数中 局部参数脚本事例
#!/bin/bash
#定义函数
function func(){
local a=99
}
#调用函数
func
#输出函数内部的变量
echo $a
#运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收,例
#如,$1 表示第一个参数,$2 表示第二个参数,依次类推。例如
sh test.sh 1 2 3
#shell脚本中函数的参数
#!/bin/bash
#定义函数
function func(){
echo "Language: $1"
echo "URL: $2"
}
#调用函数
func C++ http://c.biancheng.net/cplus/
#注:$0 当前脚本的文件名。
#注:$# 传递给脚本或函数的参数个数。
#注:$* 传递给脚本或函数的所有参数。
#注:$@ 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同(自行查找)
#注:$? 上个命令的退出状态,或函数的返回值
#注:$$ 当前 Shell 进程 ID
#反引号(``)与$()的区别
#原则上讲,上面提到的两种变量替换的形式是等价的,可以随意使用;但是,反引号毕竟看起来像单引号,
#有时候会对查看代码造成困扰,而使用 $() 就相对清晰,能有效避免这种混乱。而且有些情况必须使用
#$():$() 支持嵌套,反引号不行。 例如:
[root@localhost ~]# Fir_File_Lines=$(wc -l $(ls | sed -n '1p'))
[root@localhost ~]# echo "$Fir_File_Lines"
36 anaconda-ks.cfg
#shell字符串 Begin
#获取字符串长度:${#string_name}
#字符串拼接:在 Shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接
#name="Shell"
#url="http://c.biancheng.net/shell/"
#str1=$name$url #中间不能有空格
#str2="$name $url" #如果被双引号包围,那么中间可以有空格
#str3=$name": "$url #中间可以出现别的字符串
#str4="$name: $url" #这样写也可以
#str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
#字符串截取(从左侧开始计数):${string: start :length}
#字符串截取(从右侧开始计数):${string: 0-start :length}
注:
#从左边开始计数时,起始数字是 0(这符合程序员思维);从右边开始计数时,起始数字是 1(这符
常人思维)。计数方向不同,起始数字也不同。
#不管从哪边开始计数,截取方向都是从左到右。
#字符串截取(从指定字符开始):${string#*chars}
注:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。遇到一个通配符就停止
#如果希望直到最后一个指定字符(子字符串)再匹配结束,那么可以使用##
#格式:${string##*chars}
#使用%截取左边字符:${string%chars*}
#汇总:
${string: start :length}:从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start}:从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length}:从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start}:从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars}:从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string##*chars}:从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string%*chars}:从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
${string%%*chars}:从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
#shell字符串 End
#shell数组 Begin
#数组定义:array_name=(ele1 ele2 ele3 ... elen)
#注:Shell 是弱类型的,它并不要求所有数组元素的类型必须相同,
#注:Shell 数组的长度不是固定的,定义之后还可以增加元素。
#注:你也无需逐个元素地给数组赋值,下面的代码就是只给特定元素赋值:ages=([3]=24 [5]=19 [10]=12)
#获取数组元素的值:${array_name[index]}
#使用@或*可以获取数组中的所有元素:${nums[*]} 或 ${nums[@]}
#获取数组长度:${#array_name[@]} 或 ${#array_name[*]}
#数组拼接:array_new=(${array1[@]} ${array2[@]}) 或 array_new=(${array1[*]} ${array2[*]})
注:拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起
注:两个数组之间要有一个空格,不让回赞成,前数组最后一个元素与后数组第一个元素拼接
#删除数组元素:unset array_name[index]
#删除整个数组:unset array_name
#shell数组 End