Shell 学习记录1

Shell 学习记录1

1. 赋值&输出

​ 注意等号两端不能写空格

var="hello world"
echo $var
#输出 hello world
echo $var_log
#输出 hello world_log
echo hello world + - ... 
#输出 hello world + - ...  (所有符号都会直接输出,不需要双引号)
echo "$var - log" '$var log'
#输出hello world-log $var log(单引号与双引号的区别)
var=$(hostname)
echo $var
#输出你的主机名(给变量赋系统值)

2. 查看定义的变量

​ 直接在shell窗口定义的变量(没有建立.sh结尾的文件)

#查看当前用户的所有变量
set|grep 
#查看当前用户的环境变量
env|grep 

3. 运算

​ 使用$(())注意是两个括号,最内层括号进行运算。

var=1
echo $(($var+1))
#结果为2
echo $var+1
#做字符串拼接处理,结果为1+1。

​ 使用$[]直接运算

var=1
echo $[$var+1]

​ 使用let,可以进行次幂运算

n=1
let n+=1
echo $n
#输出2
let n=n**2
echo $n
#输出4

​ 使用expr,注意运算公式之间必须有空格,且使用乘法时需加转义字符\

expr 10 + 1
var=1
expr $var + 1
#直接输出2
expr 10 \* 5
#输出50

4. 将变量设为系统变量

#将var设为系统变量
export var="hello world"

5. 预定义变量

echo "#当前shell脚本的文件名: $0"
echo "#第一个shell脚本位置参数:$1"
echo "#第二个shell脚本位置参数:$2"
echo "#第三个shell脚本位置参数:$3"
echo "#所有传递的位置参数:$*"
echo "#所有传递的位置参数:$@"
echo "#总共传递的参数个数:$#"
echo "#当前程序的PID:$$"
echo "#上一个命令执行的返回结果:$?"

其中 ∗ 返 回 一 个 整 体 , *返回一个整体, @返回一个集合(类似)

6. 通过read动态传值

read var
hello world
echo $var
#输出hello world
#可以通过read --help查看更多read的使用方法
read: read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]
    从标准输入读取一行并将其分为不同的域。
    
    从标准输入读取单独的一行,或者如果使用了 -u 选项,从文件描述符 FD 中读取。
    该行被分割成域,如同词语分割一样,并且第一个词被赋值给第一个 NAME 变量,第二
    个词被赋值给第二个 NAME 变量,如此继续,直到剩下所有的词被赋值给最后一个 NAME
    变量。只有 $IFS 变量中的字符被认作是词语分隔符。
    
    如果没有提供 NAME 变量,则读取的行被存放在 REPLY 变量中。
    
    选项:
      -a array	将词语赋值给 ARRAY 数组变量的序列下标成员,从零开始。
      -d delim	持续读取直到读入 DELIM 变量中的第一个字符,而不是换行符
      -e	在一个交互式 shell 中使用 Readline 获取行
      -i text	使用 TEXT 文本作为 Readline 的初始文字
      -n nchars	读取 nchars 个字符之后返回,而不是等到读取换行符。
    		但是分隔符仍然有效,如果遇到分隔符之前读取了不足 nchars 个字符。
      -N nchars	在准确读取了 nchars 个字符之后返回,除非遇到文件结束符或者读超时,
    		任何的分隔符都被忽略
      -p prompt	在尝试读取之前输出 PROMPT 提示符并且不带
    		换行符
      -r	不允许反斜杠转义任何字符
      -s	不显示终端的任何输入
      -t timeout	如果在 TIMEOUT 秒内没有读取一个完整的行则超时并且返回失败。
    		TMOUT 变量的值是默认的超时时间。
    		TIMEOUT 可以是小数。如果 TIMEOUT 是 0,那么仅当在指定的文件描述符上
    		输入有效的时候,read 才返回成功。
    		如果超过了超时时间,则返回状态码大于 128
      -u fd	从文件描述符 FD 中读取,而不是标准输入
    
    退出状态:
    返回码为零,除非遇到了文件结束符,读超时,或者无效的文
    件描述符作为参数传递给了 -u 选项。

7. 写脚本

​ 以上的内容可以直接在Linux系统下呼出中端直接编写,也可以写成文件以.sh为结尾,为了规范我们一般在脚本第一行加上解释方法。

#!/usr/bin/bash
#用bash来解释
#编写脚本
vim a.sh
#运行脚本
sh a.sh
./a.sh

在脚本中可以不加任何修饰的写系统命令

var=hello world
echo $var
ls

执行这个脚本会先输出var的值然后显示当前目录

8. Declare声明

​ 我们可以通过Declare将变量声明为固定的类型

declare -i var=1
#将var固定为整形
#可以通过Declare --help查看更多说明
declare: declare [-aAfFgilnrtux] [-p] [名称[=] ...]
    设定变量值和属性。
    
    声明变量并且赋予它们属性。如果没用给定名称,
    则显示所有变量的属性和值。
    
    选项:
      -f	限制动作或显示为只函数名称和定义
      -F	限制仅显示函数名称 (以及行号和源文件名,当调试时)
      -g	当用于 shell 函数内时创建全局变量; 否则忽略
      -p	显示每个 NAME 变量的属性和值
    
    设定属性的选项:
      -a	使 NAME 成为下标数组 (如果支持)
      -A	使 NAME 成为关联数组 (如果支持)
      -i	使 NAME 带有 `integer' (整数)属性
      -l	将 NAME 在赋值时转为小写
      -n	使 NAME 成为指向一个以其值为名称的变量的引用
      -r	将 NAME 变为只读
      -t	使 NAME 带有 `trace' (追踪)属性
      -u	将 NAME 在赋值时转为大写
      -x	将 NAME 导出
    
    用 `+' 代替 `-' 会关闭指定选项。
    
    带有整数属性的变量在赋值时将使用算术估值(`let' 命令)
    
    在函数中使用时,`declare' 使 NAME 成为本地变量,和 `local'
    命令一致。`-g' 选项抑制此行为。
    
    退出状态:
    返回成功除非使用了无效选项或者发生错误。

你可能感兴趣的:(Shell 学习记录1)