程序通常可理解為由指令+數據組成
數據
先說數據:數據有很多種,如磁盤文件,io設備輸入數據,內存中的變量等
而數據中變量是很重要一種,按照作用域范圍可分為:
-
本地變量:作用域為當前shell
只能在當前bash下使用的,子bush就不能生效了,例如在當前bash下再次輸入bash會進入子bash,此時上一個bash中定義的本地變量就無法使用了。(通過pstree命令可以查看當前所在的bash位置)
本地變量的定義:name=value
本地變量的刪除:unset name
[root@localhost ~]# name1=tom 本地變量賦值
[root@localhost ~]# echo $name1 #本地bash可以顯示
tom
[root@localhost ~]# bash #進入子bash
[root@localhost ~]# echo $name1 #子bash無法顯示
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $name1
tom
[root@localhost ~]# unset name1 #取消bash
[root@localhost ~]# echo $name1
[root@localhost ~]#
- 環境變量:作用域為當前shell和子shell
[root@localhost ~]# export name1=tom
[root@localhost ~]# echo $name1
tom
[root@localhost ~]# bash
[root@localhost ~]# echo $name1
tom
- 局部變量:作用域為函數內部
指令
指令也就是命令,這里主要關注命令的幾個特性:
-
多命令執行:
COMMAND1;COMMAND2;COMMAND3;...
-
短路法則:通過與、或、非等命令對代碼的執行進行控制
與&&
:例如COMMAND1&&COMMAND2
,若COMMAND1
執行不成功,則COMMAND2
就不會被執行,只有COMMAND1
執行成功COMMAND2
才會被執行;
或||
:例如COMMAND1||COMMAND2
,若COMMAND1
執行成功,則COMMAND2
就不會被執行;
如何寫shell腳本
shell腳本基本就是簡單的命令堆砌,不過若想直接當作可執行文件運行時需要在腳本第一行給出shebang,也就是解釋器的位置:#!/bin/bash
,此外還需注意新建的文件通常沒有執行權限,可通過chamod +x /PATH/FILE_NAME
來添加執行權限。
常見的解釋器還有:#!/usr/bin/python
,#!/usr/bin/perl
。
例如以下bash腳本:
#!/bin/bash
id user3||useradd user3 #若沒有user3用戶,則創建(此處用到了短路法則中的或||命令)
echo "user3" | passwd --stdin user3 #將'user3'作為user3用戶的密碼
mktemp -d /tmp/test.XXXXXX #創建一個隨機臨時文件
運行結果為:
[root@localhost ~]# bash myfirst.sh
uid=4008(user3) gid=4008(user3) 組=4008(user3)
更改用戶 user3 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
/tmp/test.3AGefp
bash的配置文件:突破shell的生命周期
因為bash程序所使用的變量依賴于shell,而shell的本地變量與環境變量,通常只能在當前shell或當前shell和其子shell中使用,一旦重啟shell就會遺失,這會導致bash腳本僅能在當前shell有效運行,換個shell就不行了,失去了腳本的復用性。而這種問題,可以通過修改配置文件來解決
shell通常分為交互式shell與非交互式shell,而這兩種方式讀取的配置文件并不相同:
1、交互式shell的配置文件
-
全局:對所有用戶都生效;
/etc/profile
/etc/profile.d/*.sh
-
用戶個人:僅對當前用戶有效;
~/.bash_profile
-
功用:
1、用于定義環境變量;
2、運行命令或腳本;
2、非交互式shell的配置文件
-
全局:
/etc/bashrc
-
用戶個人:
~/.bashrc
-
功用:
1、定義本地變量;
2、定義命令別名;
應用1:定義一個對當前用戶生效的命令別名
[root@localhost ~]# cat /root/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias cls='clear' #增加的命令別名
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
應用2:讓centos用戶登錄時,提示其已經登陸,并顯示當前系統時間
[root@localhost ~]# nano /etc/profile.d/welcome.sh
echo "Welcome home,$USER"
date
重啟shell時就會看到
Last login: Wed Jul 25 15:55:31 2018 from 172.16.74.1
Welcome home,root
2018年 07月 25日 星期三 17:31:01 CST