日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

刪除重復(fù)的數(shù)組元素

創(chuàng)建臨時(shí)關(guān)聯(lián)數(shù)組。設(shè)置關(guān)聯(lián)數(shù)組
值并發(fā)生重復(fù)賦值時(shí),bash會(huì)覆蓋該鍵。這
允許我們有效地刪除數(shù)組重復(fù)。

CAVEAT:需要bash4+

示例功能:

remove_array_dups() {
    # Usage: remove_array_dups "array"
    declare -A tmp_array

    for i in "$@"; do
        [[ $i ]] && IFS=" " tmp_array["${i:- }"]=1
    done

    printf '%sn' "${!tmp_array[@]}"
}

用法示例:

$ remove_array_dups 1 1 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5
1
2
3
4
5

$ arr=(red red green blue blue)
$ remove_array_dups "${arr[@]}"
red
green
blue

隨機(jī)數(shù)組元素

示例功能:

random_array_element() {
    # Usage: random_array_element "array"
    local arr=("$@")
    printf '%sn' "${arr[RANDOM % $#]}"
}

用法示例:

$ array=(red green blue yellow brown)
$ random_array_element "${array[@]}"
yellow

# Multiple arguments can also be passed.
$ random_array_element 1 2 3 4 5 6 7
3

循環(huán)一個(gè)數(shù)組

每次printf調(diào)用時(shí),都會(huì)打印下一個(gè)數(shù)組元素。當(dāng)
打印到達(dá)最后一個(gè)數(shù)組元素時(shí),它
再次從第一個(gè)元素開(kāi)始。

arr=(a b c d)

cycle() {
    printf '%s ' "${arr[${i:=0}]}"
    ((i=i>=${#arr[@]}-1?0:++i))
}

在兩個(gè)值之間切換

這與上面的工作方式相同,這只是一個(gè)不同的用例。

arr=(true false)

cycle() {
    printf '%s ' "${arr[${i:=0}]}"
    ((i=i>=${#arr[@]}-1?0:++i))
}

LOOPS

循環(huán)一系列數(shù)字

替代seq。

# Loop from 0-100 (no variable support).
for i in {0..100}; do
    printf '%sn' "$i"
done

循環(huán)遍歷可變數(shù)字范圍

替代seq。

# Loop from 0-VAR.
VAR=50
for ((i=0;i<=VAR;i++)); do
    printf '%sn' "$i"
done

循環(huán)數(shù)組

arr=(Apples oranges tomatoes)

# Just elements.
for element in "${arr[@]}"; do
    printf '%sn' "$element"
done

循環(huán)遍歷帶索引的數(shù)組

arr=(apples oranges tomatoes)

# Elements and index.
for i in "${!arr[@]}"; do
    printf '%sn' "${arr[i]}"
done

# Alternative method.
for ((i=0;i<${#arr[@]};i++)); do
    printf '%sn' "${arr[i]}"
done

循環(huán)遍歷文件的內(nèi)容

while read -r line; do
    printf '%sn' "$line"
done < "file"

循環(huán)遍歷文件和目錄

不要用ls。

# Greedy example.
for file in *; do
    printf '%sn' "$file"
done

# PNG files in dir.
for file in ~/Pictures/*.png; do
    printf '%sn' "$file"
done

# Iterate over directories.
for dir in ~/Downloads/*/; do
    printf '%sn' "$dir"
done

# Brace Expansion.
for file in /path/to/parentdir/{file1,file2,subdir/file3}; do
    printf '%sn' "$file"
done

# Iterate recursively.
shopt -s globstar
for file in ~/Pictures/**/*; do
    printf '%sn' "$file"
done
shopt -u globstar

文件處理

CAVEAT: bash在版本中不能正確處理二進(jìn)制數(shù)據(jù)< 4.4。

將文件讀取為字符串

替代cat命令。

file_data="$(<"file")"

將文件讀取到數(shù)組(按行)

替代cat命令。

# Bash <4
IFS=$'n' read -d "" -ra file_data < "file"

# Bash 4+
mapfile -t file_data < "file"

獲取文件的前N行

替代head命令。

CAVEAT:需要bash4+

示例功能:

head() {
    # Usage: head "n" "file"
    mapfile -tn "$1" line < "$2"
    printf '%sn' "${line[@]}"
}

用法示例:

$ head 2 ~/.bashrc
# Prompt
PS1='? '

$ head 1 ~/.bashrc
# Prompt

獲取文件的最后N行

替代tail命令。

CAVEAT:需要bash4+

示例功能:

tail() {
    # Usage: tail "n" "file"
    mapfile -tn 0 line < "$2"
    printf '%sn' "${line[@]: -$1}"
}

用法示例:

$ tail 2 ~/.bashrc
# Enable tmux.
# [[ -z "$TMUX"  ]] && exec tmux

$ tail 1 ~/.bashrc
# [[ -z "$TMUX"  ]] && exec tmux

獲取文件中的行數(shù)

替代wc -l。

示例函數(shù)(bash 4):

lines() {
    # Usage: lines "file"
    mapfile -tn 0 lines < "$1"
    printf '%sn' "${#lines[@]}"
}

示例函數(shù)(bash 3):

此方法使用的內(nèi)存少于mapfile方法,并在bash3中工作,但對(duì)于較大的文件,它的速度較慢。

lines_loop() {
    # Usage: lines_loop "file"
    count=0
    while IFS= read -r _; do
        ((count++))
    done < "$1"
    printf '%sn' "$count"
}

用法示例:

$ lines ~/.bashrc
48

$ lines_loop ~/.bashrc
48

計(jì)算目錄中的文件或目錄

這是通過(guò)將glob的輸出傳遞給函數(shù)然后計(jì)算參數(shù)的數(shù)量來(lái)實(shí)現(xiàn)的。

示例功能:

count() {
    # Usage: count /path/to/dir/*
    #        count /path/to/dir/*/
    printf '%sn' "$#"
}

用法示例:

# Count all files in dir.
$ count ~/Downloads/*
232

# Count all dirs in dir.
$ count ~/Downloads/*/
45

# Count all jpg files in dir.
$ count ~/Pictures/*.jpg
64

創(chuàng)建一個(gè)空文件

替代touch。

# Shortest.
>file

# Longer alternatives:
:>file
echo -n >file
printf '' >file

提取兩個(gè)標(biāo)記之間的線條

示例功能:

extract() {
    # Usage: extract file "opening marker" "closing marker"
    while IFS=$'n' read -r line; do
        [[ $extract && $line != "$3" ]] &&
            printf '%sn' "$line"

        [[ $line == "$2" ]] && extract=1
        [[ $line == "$3" ]] && extract=
    done < "$1"
}

用法示例:

# Extract code blocks from MarkDown file.
$ extract ~/projects/pure-bash/README.md '```sh' '```'
# Output here...

文件路徑

獲取文件路徑的目錄名稱(chēng)

替代dirname命令。

示例功能:

dirname() {
    # Usage: dirname "path"
    printf '%sn' "${1%/*}/"
}

用法示例:

$ dirname ~/Pictures/Wallpapers/1.jpg
/home/black/Pictures/Wallpapers/

$ dirname ~/Pictures/Downloads/
/home/black/Pictures/

獲取文件路徑的基本名稱(chēng)

替代basename命令。

示例功能:

basename() {
    # Usage: basename "path"
    : "${1%/}"
    printf '%sn' "${_##*/}"
}

用法示例:

$ basename ~/Pictures/Wallpapers/1.jpg
1.jpg

$ basename ~/Pictures/Downloads/
Downloads

變量

使用變量分配和訪問(wèn)變量

$ hello_world="value"

# Create the variable name.
$ var="world"
$ ref="hello_$var"

# Print the value of the variable name stored in 'hello_$var'.
$ printf '%sn' "${!ref}"
value

或者,在bash4.3+上:

$ hello_world="value"
$ var="world"

# Declare a nameref.
$ declare -n ref=hello_$var

$ printf '%sn' "$ref"
value

根據(jù)另一個(gè)變量命名變量

$ var="world"
$ declare "hello_$var=value"
$ printf '%sn' "$hello_world"
value

ESCAPE序列

與流行的看法相反,使用原始逃逸序列沒(méi)有問(wèn)題。使用tput與手動(dòng)打印相同的ANSI序列的摘要。更糟糕的是,tput實(shí)際上并不便攜。有許多tput變體,每個(gè)變體都有不同的命令和語(yǔ)法(嘗試tput setaf 3使用FreeBSD系統(tǒng))。原始序列很好。

文字顏色

注意:需要RGB值的序列僅適用于真彩色終端仿真器。

序列

它有什么作用?

e[38;5;<NUM>m

設(shè)置文本前景色。

0-255

e[48;5;<NUM>m

設(shè)置文本背景顏色。

0-255

e[38;2;<R>;<G>;<B>m

將文本前景色設(shè)置為RGB顏色。

R,G,B

e[48;2;<R>;<G>;<B>m

將文本背景顏色設(shè)置為RGB顏色。

R,G,B

文字屬性

序列

它有什么作用?

e[m

重置文本格式和顏色。

e[1m

粗體。

e[2m

微弱的文字。

e[3m

斜體文字。

e[4m

下劃線文字。

e[5m

慢慢眨眼。

e[7m

交換前景色和背景色。

光標(biāo)移動(dòng)

序列

它有什么作用?

e[<LINE>;<COLUMN>H

將光標(biāo)移動(dòng)到絕對(duì)位置。

line, column

e[H

將光標(biāo)移動(dòng)到原位(0,0)。

 

e[<NUM>A

將光標(biāo)向上移動(dòng)N行。

num

e[<NUM>B

將光標(biāo)向下移動(dòng)N行。

num

e[<NUM>C

將光標(biāo)向右移動(dòng)N列。

num

e[<NUM>D

將光標(biāo)向左移動(dòng)N列。

num

e[s

保存光標(biāo)位置。

 

e[u

恢復(fù)光標(biāo)位置。

 

刪除文本

序列

它有什么作用?

e[K

從光標(biāo)位置刪除到行尾。

e[1K

從光標(biāo)位置刪除到行首。

e[2K

擦除整個(gè)當(dāng)前行。

e[J

從當(dāng)前行刪除到屏幕底部。

e[1J

從當(dāng)前行刪除到屏幕頂部。

e[2J

清除屏幕。

e[2Je[H

清除屏幕并將光標(biāo)移動(dòng)到0,0。

參數(shù)擴(kuò)展

間接

參數(shù)

它有什么作用?

${!VAR}

根據(jù)值訪問(wèn)變量VAR。

${!VAR*}

展開(kāi)為IFS以VAR。開(kāi)頭的變量名稱(chēng)的分隔列表。

${!VAR@}

展開(kāi)為IFS以VAR。開(kāi)頭的變量名稱(chēng)的分隔列表。如果是雙引號(hào),則每個(gè)變量名稱(chēng)都會(huì)擴(kuò)展為單獨(dú)的單詞。

替換

參數(shù)

它有什么作用?

${VAR#PATTERN}

從字符串的開(kāi)頭刪除模式的最短匹配。

${VAR##PATTERN}

從字符串的開(kāi)頭刪除模式的最長(zhǎng)匹配。

${VAR%PATTERN}

從字符串末尾刪除模式的最短匹配。

${VAR%%PATTERN}

從字符串末尾刪除模式的最長(zhǎng)匹配。

${VAR/PATTERN/REPLACE}

用字符串替換第一個(gè)匹配。

${VAR//PATTERN/REPLACE}

用字符串替換所有匹配項(xiàng)。

${VAR/PATTERN}

刪除第一場(chǎng)比賽。

${VAR//PATTERN}

刪除所有比賽。

長(zhǎng)度

參數(shù)

它有什么作用?

${#VAR}

字符變量的長(zhǎng)度。

${#ARR[@]}

元素中的數(shù)組長(zhǎng)度。

擴(kuò)張

參數(shù)

它有什么作用?

 

${VAR:OFFSET}

N從變量中刪除第一個(gè)字符。

 

${VAR:OFFSET:LENGTH}

從N字符到N字符獲取子字符串。

 

(${VAR:10:10}:從char 10到char 獲取子字符串20)

 

 

${VAR:: OFFSET}

N從變量中獲取第一個(gè)字符。

 

${VAR:: -OFFSET}

N從變量中刪除最后一個(gè)字符。

 

${VAR: -OFFSET}

N從變量中獲取最后一個(gè)字符。

 

${VAR:OFFSET:-OFFSET}

削減第一個(gè)N字符和最后一個(gè)N字符。

bash 4.2+

案例修改

參數(shù)

它有什么作用?

警告

${VAR^}

大寫(xiě)第一個(gè)字符。

bash 4+

${VAR^^}

大寫(xiě)所有字符。

bash 4+

${VAR,}

小寫(xiě)第一個(gè)字符。

bash 4+

${VAR,,}

小寫(xiě)所有字符。

bash 4+

默認(rèn)值

參數(shù)

它有什么作用?

${VAR:-STRING}

如果VAR為空或未設(shè)置,請(qǐng)使用STRING其值。

${VAR-STRING}

如果VAR未設(shè)置,請(qǐng)使用STRING其值。

${VAR:=STRING}

如果VAR為空或未設(shè)置,請(qǐng)將值設(shè)置VAR為STRING。

${VAR=STRING}

如果VAR未設(shè)置,請(qǐng)將值設(shè)置VAR為STRING。

${VAR:+STRING}

如果VAR不為空,則使用STRING其值。

${VAR+STRING}

如果VAR已設(shè)置,則使用STRING其值。

${VAR:?STRING}

如果為空或未設(shè)置,則顯示錯(cuò)誤。

${VAR?STRING}

如果未設(shè)置則顯示錯(cuò)誤。

BRACE EXPANSION

范圍

# Syntax: {<START>..<END>}

# Print numbers 1-100.
echo {1..100}

# Print range of floats.
echo 1.{1..9}

# Print chars a-z.
echo {a..z}
echo {A..Z}

# Nesting.
echo {A..Z}{0..9}

# Print zero-padded numbers.
# CAVEAT: bash 4+
echo {01..100}

# Change increment amount.
# Syntax: {<START>..<END>..<INCREMENT>}
# CAVEAT: bash 4+
echo {1..10..2} # Increment by 2.

字符串列表

echo {apples,oranges,pears,grapes}

# Example Usage:
# Remove dirs Movies, Music and ISOS from ~/Downloads/.
rm -rf ~/Downloads/{Movies,Music,ISOS}

有條件的表達(dá)

文件條件

表達(dá)

它有什么作用?

-a

file

如果文件存在。

-b

file

如果文件存在并且是塊特殊文件。

-c

file

如果文件存在并且是字符特殊文件。

-d

file

如果文件存在且是目錄。

-e

file

如果文件存在。

-f

file

如果文件存在且是常規(guī)文件。

-g

file

如果文件存在且其set-group-id位已設(shè)置。

-h

file

如果文件存在并且是符號(hào)鏈接。

-k

file

如果文件存在且其粘滯位已設(shè)置

-p

file

如果文件存在并且是命名管道(FIFO)。

-r

file

如果文件存在且可讀。

-s

file

如果文件存在且其大小大于零。

-t

fd

如果文件描述符是打開(kāi)的并且引用了終端。

-u

file

如果文件存在且其set-user-id位已設(shè)置。

-w

file

如果文件存在且可寫(xiě)。

-x

file

如果文件存在且可執(zhí)行。

-G

file

如果文件存在且由有效組ID擁有。

-L

file

如果文件存在并且是符號(hào)鏈接。

-N

file

如果文件存在且自上次讀取后已被修改。

-O

file

如果文件存在并且由有效用戶ID擁有。

-S

file

如果文件存在且是套接字。

文件比較

表達(dá)

它有什么作用?

file -ef file2

如果兩個(gè)文件都引用相同的inode和設(shè)備編號(hào)。

file -nt file2

如果file比f(wàn)ile2(使用修改時(shí)間)更新或file存在file2而不存在。

file -ot file2

如果file早于file2(使用修改時(shí)間)或file2存在file而不存在。

可變條件

表達(dá)

它有什么作用?

-o

opt

如果啟用了shell選項(xiàng)。

-v

var

如果變量具有指定的值。

-R

var

如果variable是名稱(chēng)引用。

-z

var

如果字符串的長(zhǎng)度為零。

-n

var

如果字符串的長(zhǎng)度不為零。

變量比較

表達(dá)

它有什么作用?

var = var2

等于。

var == var2

等于(同義詞=)。

var != var2

不等于。

var < var2

小于(以ASCII字母順序排列。

var > var2

大于(以ASCII字母順序排列。

算術(shù)運(yùn)算符

分配

運(yùn)營(yíng)商

它有什么作用?

=

初始化或更改變量的值。

算術(shù)

運(yùn)營(yíng)商

它有什么作用?

+

加成

-

減法

*

乘法

/

**

%

+=

加 - 等于(增加變量。

-=

減去等于(減少變量。

*=

時(shí)間相等(乘以變量。

/=

Slash-Equal(除以變量。

%=

Mod-Equal(除去變量的剩余部分。

按位

運(yùn)營(yíng)商

它有什么作用?

 

<<

按位左移

 

<<=

左移平等

 

>>

按位右移

 

>>=

右移平等

 

&

按位AND

 

&=

按位AND-Equal

 

`

`

按位OR

`

=`

按位OR-等于

~

按位NOT

 

^

按位異或

 

^=

按位XOR-Equal

 

合乎邏輯

運(yùn)營(yíng)商

它有什么作用?

 

 

!

 

 

&&

 

 

`

 

`

要么

運(yùn)營(yíng)商

它有什么作用?

,

逗號(hào)分隔符

((a=1,b=2,c=3))

算術(shù)

設(shè)置變量的語(yǔ)法更簡(jiǎn)單

# Simple math
((var=1+2))

# Decrement/Increment variable
((var++))
((var--))
((var+=1))
((var-=1))

# Using variables
((var=var2*arr[2]))

三元測(cè)試

# Set the value of var to var2 if var2 is greater than var.
# var: variable to set.
# var2>var: Condition to test.
# ?var2: If the test succeeds.
# :var: If the test fails.
((var=var2>var?var2:var))

TRAPS

陷阱允許腳本在各種信號(hào)上執(zhí)行代碼。在pxltrm(用bash編寫(xiě)的像素藝術(shù)編輯器)中,陷阱用于在窗口大小調(diào)整時(shí)重繪用戶界面。另一個(gè)用例是在腳本退出時(shí)清理臨時(shí)文件。

應(yīng)該在腳本開(kāi)頭附近添加陷阱,以便捕獲任何早期錯(cuò)誤。

注意:有關(guān)信號(hào)的完整列表,請(qǐng)參閱trap -l。

在腳本退出時(shí)做一些事情

# Clear screen on script exit.
trap 'printf \e[2J\e[H\e[m' EXIT

忽略終端中斷(CTRL + C,SIGINT)

trap '' INT

對(duì)窗口調(diào)整大小做出反應(yīng)

# Call a function on window resize.
trap 'code_here' SIGWINCH

在每個(gè)命令之前做點(diǎn)什么

trap 'code_here' DEBUG

當(dāng)shell函數(shù)或源文件完成執(zhí)行時(shí)執(zhí)行某些操作

trap 'code_here' RETURN

性能

禁用Unicode

如果不需要unicode,則可以禁用它以提高性能。結(jié)果可能會(huì)有所不同,但是neofetch和其他程序有明顯改善。

# Disable unicode.
LC_ALL=C
LANG=C

已過(guò)時(shí)的語(yǔ)法

家當(dāng)

用#!/usr/bin/env bash而不是#!/bin/bash。

  • 前者搜索用戶PATH以查找bash二進(jìn)制文件。
  • 后者假設(shè)它始終安裝/bin/可能導(dǎo)致問(wèn)題。
# Right:

    #!/usr/bin/env bash

# Wrong:

    #!/bin/bash

命令替換

用$()而不是。

# Right.
var="$(command)"

# Wrong.
var=`command`

# $() can easily be nested whereas `` cannot.
var="$(command "$(command)")"

功能聲明

不要使用function關(guān)鍵字,它會(huì)降低與舊版本的兼容性bash。

# Right.
do_something() {
    # ...
}

# Wrong.
function do_something() {
    # ...
}

內(nèi)部變量

獲取bash二進(jìn)制文件的位置

"$BASH"

獲取當(dāng)前正在運(yùn)行的bash進(jìn)程的版本

# As a string.
"$BASH_VERSION"

# As an array.
"${BASH_VERSINFO[@]}"

打開(kāi)用戶首選的文本編輯器

"$EDITOR" "$file"

# NOTE: This variable may be empty, set a fallback value.
"${EDITOR:-vi}" "$file"

獲取當(dāng)前函數(shù)的名稱(chēng)

# Current function.
"${FUNCNAME[0]}"

# Parent function.
"${FUNCNAME[1]}"

# So on and so forth.
"${FUNCNAME[2]}"
"${FUNCNAME[3]}"

# All functions including parents.
"${FUNCNAME[@]}"

獲取系統(tǒng)的主機(jī)名

"$HOSTNAME"

# NOTE: This variable may be empty.
# Optionally set a fallback to the hostname command.
"${HOSTNAME:-$(hostname)}"

獲取操作系統(tǒng)的體系結(jié)構(gòu)

"$HOSTTYPE"

獲取操作系統(tǒng)/內(nèi)核的名稱(chēng)

這可用于為不同的操作系統(tǒng)添加條件支持,
而無(wú)需調(diào)用uname。

"$OSTYPE"

獲取當(dāng)前的工作目錄

這是pwd內(nèi)置的替代品。

"$PWD"

獲取腳本運(yùn)行的秒數(shù)

"$SECONDS"

獲取偽隨機(jī)整數(shù)

每次$RANDOM使用時(shí),之間的不同整數(shù)0及32767被返回。此變量不應(yīng)用于與安全性相關(guān)的任何內(nèi)容(包括加密密鑰等)。

"$RANDOM"

有關(guān)終端的信息

獲取行和列中的終端大小(來(lái)自腳本)

在純bash中編寫(xiě)腳本和stty/ tput無(wú)法
調(diào)用時(shí),這很方便。

示例功能:

get_term_size() {
    # Usage: get_term_size

    # (:;:) is a micro sleep to ensure the variables are
    # exported immediately.
    shopt -s checkwinsize; (:;:)
    printf '%sn' "$LINES $COLUMNS"
}

用法示例:

# Output: LINES COLUMNS
$ get_term_size
15 55

以像素為單位獲取終端大小

CAVEAT:這在某些終端仿真器中不起作用。

示例功能:

get_window_size() {
    # Usage: get_window_size
    printf '%b' "${TMUX:+\ePtmux;\e}\e[14t${TMUX:+\e\\}"
    IFS=';t' read -d t -t 0.05 -sra term_size
    printf '%sn' "${term_size[1]}x${term_size[2]}"
}

用法示例:

# Output: WIDTHxHEIGHT
$ get_window_size
1200x800

# Output (fail):
$ get_window_size
x

獲取當(dāng)前光標(biāo)位置

在純bash中創(chuàng)建TUI時(shí),這很有用。

示例功能:

get_cursor_pos() {
    # Usage: get_cursor_pos
    IFS='[;' read -p $'e[6n' -d R -rs _ y x _
    printf '%sn' "$x $y"
}

用法示例:

# Output: X Y
$ get_cursor_pos
1 8

轉(zhuǎn)換

將十六進(jìn)制顏色轉(zhuǎn)換為RGB

示例功能:

hex_to_rgb() {
    # Usage: hex_to_rgb "#FFFFFF"
    #        hex_to_rgb "000000"
    : "${1/#}"
    ((r=16#${_:0:2},g=16#${_:2:2},b=16#${_:4:2}))
    printf '%sn' "$r $g $b"
}

用法示例:

$ hex_to_rgb "#FFFFFF"
255 255 255

將RGB顏色轉(zhuǎn)換為十六進(jìn)制

示例功能:

rgb_to_hex() {
    # Usage: rgb_to_hex "r" "g" "b"
    printf '#%02x%02x%02xn' "$1" "$2" "$3"
}

用法示例:

$ rgb_to_hex "255" "255" "255"
#FFFFFF

CODE GOLF

更短的for循環(huán)語(yǔ)法

# Tiny C Style.
for((;i++<10;)){ echo "$i";}

# Undocumented method.
for i in {1..10};{ echo "$i";}

# Expansion.
for i in {1..10}; do echo "$i"; done

# C Style.
for((i=0;i<=10;i++)); do echo "$i"; done

更短的無(wú)限循環(huán)

# Normal method
while :; do echo hi; done

# Shorter
for((;;)){ echo hi;}

更短的功能聲明

# Normal method
f(){ echo hi;}

# Using a subshell
f()(echo hi)

# Using arithmetic
# This can be used to assign integer values.
# Example: f a=1
#          f a++
f()(($1))

# Using tests, loops etc.
# NOTE: ‘while’, ‘until’, ‘case’, ‘(())’, ‘[[]]’ can also be used.
f()if true; then echo "$1"; fi
f()for i in "$@"; do echo "$i"; done

if語(yǔ)法更短

# One line
# Note: The 3rd statement may run when the 1st is true
[[ $var == hello ]] && echo hi || echo bye
[[ $var == hello ]] && { echo hi; echo there; } || echo bye

# Multi line (no else, single statement)
# Note: The exit status may not be the same as with an if statement
[[ $var == hello ]] &&
    echo hi

# Multi line (no else)
[[ $var == hello ]] && {
    echo hi
    # ...
}

case設(shè)置變量的簡(jiǎn)單語(yǔ)句

在:內(nèi)置的可以用來(lái)避免重復(fù)variable=在一個(gè)case語(yǔ)句。該$_變量存儲(chǔ)的最后一個(gè)命令的最后一個(gè)參數(shù)。:總是成功,所以它可以用來(lái)存儲(chǔ)變量值。

# Modified snippet from Neofetch.
case "$OSTYPE" in
    "darwin"*)
        : "macOS"
    ;;

    "linux"*)
        : "Linux"
    ;;

    *"bsd"* | "dragonfly" | "bitrig")
        : "BSD"
    ;;

    "cygwin" | "msys" | "win32")
        : "windows"
    ;;

    *)
        printf '%sn' "Unknown OS detected, aborting..." >&2
        exit 1
    ;;
esac

# Finally, set the variable.
os="$_"

其他

使用read作為替代的sleep命令

令人驚訝的是,sleep是一個(gè)外部命令而不是bash內(nèi)置命令。

CAVEAT:需要bash4+

示例功能:

read_sleep() {
    # Usage: sleep 1
    #        sleep 0.2
    read -rst "${1:-1}" -N 999
}

用法示例:

read_sleep 1
read_sleep 0.1
read_sleep 30

檢查程序是否在用戶的PATH中

# There are 3 ways to do this and either one can be used.
type -p executable_name &>/dev/null
hash executable_name &>/dev/null
command -v executable_name &>/dev/null

# As a test.
if type -p executable_name &>/dev/null; then
    # Program is in PATH.
fi

# Inverse.
if ! type -p executable_name &>/dev/null; then
    # Program is not in PATH.
fi

# Example (Exit early if program is not installed).
if ! type -p convert &>/dev/null; then
    printf '%sn' "error: convert is not installed, exiting..."
    exit 1
fi

使用獲取當(dāng)前日期 strftime

Bash printf有一個(gè)內(nèi)置的獲取日期的方法,可用于代替date命令。

CAVEAT:需要bash4+

示例功能:

date() {
    # Usage: date "format"
    # See: 'man strftime' for format.
    printf "%($1)T\n" "-1"
}

用法示例:

# Using above function.
$ date "%a %d %b  - %l:%M %p"
Fri 15 Jun  - 10:00 AM

# Using printf directly.
$ printf '%(%a %d %b  - %l:%M %p)Tn' "-1"
Fri 15 Jun  - 10:00 AM

# Assigning a variable using printf.
$ printf -v date '%(%a %d %b  - %l:%M %p)Tn' '-1'
$ printf '%sn' "$date"
Fri 15 Jun  - 10:00 AM

獲取當(dāng)前用戶的用戶名

CAVEAT:需要bash4.4+

$ : \u
# Expand the parameter as if it were a prompt string.
$ printf '%sn' "${_@P}"
black

生成UUID V4

CAVEAT:生成的值不具有加密安全性。

示例功能:

uuid() {
    # Usage: uuid
    C="89ab"

    for ((N=0;N<16;++N)); do
        B="$((RANDOM%256))"

        case "$N" in
            6)  printf '4%x' "$((B%16))" ;;
            8)  printf '%c%x' "${C:$RANDOM%${#C}:1}" "$((B%16))" ;;

            3|5|7|9)
                printf '%02x-' "$B"
            ;;

            *)
                printf '%02x' "$B"
            ;;
        esac
    done

    printf 'n'
}

用法示例:

$ uuid
d5b6c731-1310-4c24-9fe3-55d556d44374

進(jìn)度條

這是一種繪制進(jìn)度條的簡(jiǎn)單方法,無(wú)需
在函數(shù)本身中使用for循環(huán)。

示例功能:

bar() {
    # Usage: bar 1 10
    #            ^----- Elapsed Percentage (0-100).
    #               ^-- Total length in chars.
    ((elapsed=$1*$2/100))

    # Create the bar with spaces.
    printf -v prog  "%${elapsed}s"
    printf -v total "%$(($2-elapsed))s"

    printf '%sr' "[${prog// /-}${total}]"
}

用法示例:

for ((i=0;i<=100;i++)); do
    # Pure bash micro sleeps (for the example).
    (:;:) && (:;:) && (:;:) && (:;:) && (:;:)

    # Print the bar.
    bar "$i" "10"
done

printf 'n'

獲取腳本中的函數(shù)列表

get_functions() {
    # Usage: get_functions
    IFS=$'n' read -d "" -ra functions < <(declare -F)
    printf '%sn' "${functions[@]//declare -f }"
}

繞過(guò)shell別名

# alias
ls

# command
# shellcheck disable=SC1001
ls

繞過(guò)shell函數(shù)

# function
ls

# command
command ls

在后臺(tái)運(yùn)行命令

這將運(yùn)行給定命令并使其保持運(yùn)行,即使在終端或SSH連接終止后也是如此。忽略所有輸出。

bkr() {
    (nohup "$@" &>/dev/null &)
}

bkr ./some_script.sh # some_script.sh is now running in the background

原文地址:
https://www.cnblogs.com/lucius/p/10965638.html

分享到:
標(biāo)簽:腳本 bash
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定