SHELL 学习第一天记录打卡

SHELL 学习第一天记录打卡

学习转载:http://c.biancheng.net/view/734.html

  • root 用户 shell提示# 、 普通用户shell 提示$
  • shell 有两层,通过echo $PS1 、 echo $PS2查看
echo "Jich"  # PS1第一层
输出: Jich
echo "     # PS2第二层
>Ji
>ch
>"
输出:
Ji
ch
  • 可以通过设定PS1的环境变量,来临时修改当前shell的提示,注:只在当前shell有效,退出shell之后无效
[mozhiyan@localhost ~]$ PS1="[\t][\u]\$ "
[17:27:34][mozhiyan]$ 
  • 创建第一个Hello World的bash文件
- 创建helloworld.sh 文件
	#!/bin/bash
    echo "Hello World !"  #这是一条语句

第 1 行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell;后面的/bin/bash就是指明了解释器的具体位置。
第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout,一般就是指终端)输出文本。在.sh文件中使用命令与在终端直接输入命令的效果是一样的。

  • 创建一个稍微复杂的shell
#!/bin/bash
# Copyright (c) http://c.biancheng.net/shell/

echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

第 5 行中表示从终端读取用户输入的数据,并赋值给 PERSON 变量。read 命令用来从标准输入文件(Standard Input,stdin,一般就是指终端)读取用户输入的数据。

第 6 行表示输出变量 PERSON 的内容。注意在变量名前边要加上$,否则变量名会作为字符串的一部分处理。

  • 如果.sh文件没有执行选项,可以直接用一下四种方式运行
sh read.sh
. ./read.sh
source read.sh
/bin/bash read.sh  # 用这种方式,其实第一行就不用写了 #!/bin/bash
# 确认系统中使用的 Shell 是 bash
$ echo $SHELL
/bin/bash

# 查看系统中 Bash Shell 的版本(方法一)
$ bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

# 查看系统中 Bash Shell 的版本(方法二)
$ echo $BASH_VERSION
3.2.25(1)-release
  • 如果安装了新的shell则需要修改
chsh #修改的是root 环境
chsh jich # 修改的是指定用户的环境

chsh 命令做的工作就是修改了 /etc/passwd 文件中登录 Shell 的路径,所以如果明白了 chsh 的原理,实际上可以手工编辑 /etc/passwd 文件

变量定义

variable=value
variable='value'
variable="value"

variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的,稍后我们会详细说明。
注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

使用变量

author="Jich"
echo $author
echo ${author}

变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

skill="Java"
echo "I am good at ${skill}Script"

修改变量的值

已定义的变量,可以被重新赋值,如:

url="http://c.biancheng.net"
echo ${url}
url="http://c.biancheng.net/shell/"
echo ${url}

第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$。

单引号和双引号的区别

前面我们还留下一个疑问,定义变量时,变量的值可以由单引号’ '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明:

#!/bin/bash
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2

运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net

以单引号’ '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

我的建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。

将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

variable=`command`
variable=$(command)

第一种方式把命令用反引号(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

例如,我在 code 目录中创建了一个名为 log.txt 的文本文件,用来记录我的日常工作。下面的代码中,使用 cat 命令将 log.txt 的内容读取出来,并赋值给一个变量,然后使用 echo 命令输出。

$ cd code
$ log=$(cat log.txt)
$ echo $log
[2018-09-10 06:53:22] Jich正在编写Shell教程
$ log=`cat log.txt`
$ echo $log
[2018-09-10 06:53:22] Jich正在编写Shell教程
$ 

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
myUrl="http://see.xidian.edu.cn/cpp/shell/"
readonly myUrl
myUrl="http://see.xidian.edu.cn/cpp/danpianji/"

运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用;unset 命令不能删除只读变量。
举个例子:

#!/bin/sh
myUrl="http://c.biancheng.net/shell/"
unset myUrl
echo $myUrl

上面的脚本没有任何输出。

你可能感兴趣的:(SHELL)