當前位置:首頁 » 網頁前端 » sh腳本IFS分割符計算個數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sh腳本IFS分割符計算個數

發布時間: 2022-06-16 08:08:38

1. shell環境變數$IFS的用法

shell環境變數$IFS的用法
S表示 Internal Field Separator (內部欄位分隔符)
示例:
$ IFS=:
$ a=Hello:World
$ echo $a

輸出的結果是:
Hello World

而不是:
Hello:World

順一門有百福 平安二字值千金 萬象更新

2. shell腳本中IFS環境變數問題

for entry in `cat /etc/passwd` 執行這個的時候已經把命令的輸出展開為一個list列表了,依據的就是當前的IFS,所以後面的再指定IFS,並不會影響已經分割好的列表。因此外層循環中的每個entry是依據換行符分割的字元串,內層循環是依據:分割的字元串

3. shell腳本處理字元串截取的問題

#!/bin/bash
sed 's/|/ /' file.txt | while read x y
do
echo $x
echo $y
done
還有一種方法,設置全局分隔符ifs(環境變數):
#!/bin/bash
default=$ifs #先備份
ifs="|"
while read x y
do
echo $x
echo $y
done <./file.txt
ifs=$default #後恢復當然,退出腳本後會自動恢復。因為腳本是在新建shell中執行,所有對環境變數的改動不會影響原shell。
這里之所以加上備份與恢復機制,是考慮到腳本中可能有其他內容,是為了不影響其他腳本段的執行。

4. shell里的域分隔符理解

shell根據IFS分割命令參數,默認的IFS是空白符(空格或TAB)。
IFS本身不會被輸出,輸出的只是分割後的參數。

兩個逗號,分割後使得echo有三個參數(中間一個參數是空字元串),相當於如下形式:
echo "()" "" "{}\""
執行後得到的結果中間就是兩個空格。

加了雙引號,就表示是一個字元串參數,不會被IFS分割。

5. 如何將IFS設置位換行符

准備

首先,你需要安裝ImageMagick,這是一個非常強大的圖形處理圖軟體套件,專門通過終端進行。你可以非常簡單地通過Homebrew來安裝ImageMagick。如果你沒有安裝Homebrew,或者你可能並不知道它是什麼,你可以在主頁上學習了解並安裝它。

如果你已經安裝了Homebrew,打開終端並輸入:

brew update

這是確定你是否從Homebrew上安裝的最新的安裝包,這個也是確認你是否有安裝Homebrew。

那麼,現在,通過使用Homebrew來安裝你所需要的安裝包。現在輸入下面的命令:

brew install ImageMagick

你將會看到一些列的東西通過Homebrew,展示了ImageMagick安裝的詳細過程,因此跟著步驟安裝。

接下來,你也需要安裝Ghostscript,因為你將使用的ImageMagick會依賴它。Ghostscript是一個軟體套件用於呈現PDF和PS文件。你需要它是因為它提供了支持ImageMagick的字體。

安裝Ghostscript通過運行下面的命令:

brew install ghostscript

如果中間發生錯誤,運行這個命令:

brew doctor

如果安裝失敗,你會得到一個消息,並告訴你如何去修復它。

這些是所有你需要安裝的,以在本教程中使用。

Llama你好

ImageMagick中有許多命令,但在本教程中,你需要用到的是convert和composite(轉換和組合)

convert:一張圖片,修改它,然後保存為一張新的圖片;

composite:一張圖片,在它上面覆蓋另外一張圖片,然後存為新的第三張圖片。

本教程中提供一些簡單地圖標供使用。當然,你也可以使用你自己的圖標,但你需要修改為相應的文件名。在這里下載圖標,對於本教程,將其放在桌面上。

這里的目標之一是覆蓋構建版本應用程序的圖標。所以你將看到如何使用ImageMagick覆蓋文本圖像將Hello World放在其中的一個圖標上。打開終端並進入到放應用程序圖標的文件夾:

cd ~/Desktop/AppIconSet

現在輸入:

convert [email protected] -fill white -font Times-Bold -pointsize 18 -gravity south -annotate 0 "Hello World" test.png

我將會逐一分解這行命令,因此你將會明白它做了寫什麼:

[email protected] 是輸入圖片的名字;
fill white 設置文本為白色;
font Times-Bold 告訴ImageMagick使用什麼字體;
pointsize 18 設置字體的大小為18;
gravity south 文本與圖片的底部對齊
annotate 0 "Hello World" 告訴ImageMagick使帶有"Hello World"文本注釋的圖片旋轉的度數為0度;
test.png 輸出的文件名,並且ImageMagick將會覆蓋掉已經存在的文件。

如果你在終端上沒有看到任何的錯誤,那麼你將會在AppIconSet的文件夾中看到一個命名為test.png的文件,打開後你會看到這樣:

提示:如果你看到了錯誤的消息,或者是腳本沒有作用,那麼可能是你沒有安裝所需的字體。通過運行下面的命令,看下你所能用的字體有哪些。

convert -list font

如果你沒有Times這個字體,那麼選擇一個你可以使用的來代替。

現在,將beta標志載入圖片上。在終端上輸入:

composite betaRibbon.png test.png test2.png

這個是將betaRibbon.png放在test.png的上面,然後將合成的圖片保存為test2.png

打開test2.png。等等,你看到的還是原來的test.png.

那麼為什麼會是這樣呢?

test.png 大小是120x120的,然而,betaRibbon.png是1024x1014的,所以betaRibbon.png只有透明的那部分在test.png上,剩下的部分被裁剪掉了。

不相信我嗎?那麼試下相同的命令,但是將betaRibbon.png 和 test.png位置交換。

composite test.png betaRibbon.png test2.png

你現在將會看到一張在test.png的右上角帶有beta的很大的圖片:

為了得到我們想要的,你需要將betaRibbon.png的尺寸改為120x120的。在ImageMagick中這是非常容易的。僅僅輸入:

convert betaRibbon.png -resize 120x120 smallBetaRibbon.png

這行命令是將betaRibbon.png的大小改為120x120,並保存為smallRetaRibbon.png

現在,執行下面:

composite smallBetaRibbon.png test.png test2.png

打開test2.png,然後你將看到我們期待的:

這些就是在本教程中你需要知道的ImageMagick的功能,但是這些僅僅是ImageMagick功能的冰山一角。點擊ImageMagick的主頁,查看更多關於它的功能。

Xcode

在這些圖像處理工作之後,是時候回到我們熟悉的平台了。

打開Xcode,選擇File\New\Project…選擇 iOS\Application\Single View
Application, 然後點擊 Next. 工程命名為Llama Trot, 選擇語言為 Swift, 然後設置設備為Universal.
然後將工程保存在桌面上。

你的目標是通過Xcode和ImageMagick,根據所選的構建配置,在每次構建時生成一個適當的圖標。

Xcode能夠在你的工程構建時運行腳本來做些事情。運行腳本僅僅是Unix腳本,就像你已經寫過的,在你每次運行你的Xcode的項目時執行。

設置一個運行腳本

在你的工程中,選擇Llama Trot的Target,然後選擇Build Phases,點擊+,在彈出的菜單中選擇New Run Script Phase:

你將會看到Run Script Phase添加到你的工程配置中。

在運行腳本時,Shell參數被自動設置為bin/sh,也就是說腳本將在bash Unix shel中執行。

下面的框是讓你用來寫腳本的。在框中輸入:

echo "Hello World"

你的新的 build phase應該看起來像下面這樣:

構建並運行。你將看到什麼也沒發生。這事因為腳本列印的"Hello World"在你的構建日誌中。

點擊Report Navigator,Xcode的導航欄面板最右邊的圖標,點擊最近構建的報告,像下圖展示的這樣。當你構建一個工程時,這里描述了Xcode為你做的所有的事情,你將會看到"Hello World":

應用圖標

很好,現在你已經寫了一個腳本輸出"Hello World",就像你作為一個開發者的職業生涯中已經做過一百萬次列印"Hello World"。現在是時候修改應用的圖標了。

從你的腳本中找到應用圖標

將所有的應用圖標都添加到Images.xcassets中,將每個圖標拖到合適的AppIcon尺寸上:

同時,你也要將debugRibbon.png 和 betaRibbon.png 放在和.xcodeproj同級的目錄文件中。

為了使用icons,你的腳本需要知道致謝icons在哪裡。用下面的代碼代替你之前寫的腳本:

echo "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" echo "${SRCROOT}"

第一行列印在你運行你的項目後的問佳佳路徑,包含最後一個圖標。
第二行列印項目文件所在的文件夾路徑。

這是通過使用Xcode的一些構建設置的變數。

運行你的項目並查看構建報告。你將會看到描述你的工程最後產品的文件路徑。在它下面,你將會看到你的項目工程所在的文件路徑:

定位到第一個文件夾,查看它所在的位置;你將看到你的app中所有的東西,包括所有的app圖標。這裡面是存放ImageMagick修改後的圖標的地方。

通過在Application icon點擊右鍵,然後選擇Show Package Contents,你將看到這些圖標。現在他們都是看起來非常正常的!

現在定位到列印的第二個文件路徑。這個僅僅是你正常工程項目的文件夾。因此,應用圖標在哪裡呢?

前往有著相同名字的Llama Trot文件。在這裡面你將看到Images.xcassets。打開Images.xcassets,你將會看到另外一個叫AppIcon.appiconset的文件。

應用圖標就在這個文件夾中,你將通過ImageMagick來修改它們。假設你將你的工程保存到桌面上命名為Llama
Trot,那麼圖標的路徑為~/Desktop/Llama\ Trot/Llama\
Trot/Images.xcassets/AppIcon.appiconset

將腳本的最後一行替換為下面的代碼,你將會得到原始圖標的我完整路徑:

IFS=$'\n' echo $(find ${SRCROOT} -name "[email protected]")

第一行設置IFS-internal欄位分隔符換行符。如果你不這樣做,第二行就會失敗,因為文件名,Llama Trot,包含一個空格。如果你好奇沒有第一行發生了什麼,你可以將其刪除後嘗試一下。
第二行中此命令$ { SRCROOT }文件夾遞歸搜索文件[email protected]

運行項目,你將會看到 AppIcon60x60@2x 完整的路徑被列印出來:

將它們放在一起

困難的事情就要結束了。現在是時候將它們放在一起,通過你的腳本來修改應用的圖標。你將首先開始修改[email protected],然後處理所有的應用圖標。這就意味著你需要在Retina@2x的模擬器或者6Plus上測試。

通過結合ImageMagick的技術和你以前的腳本,最終你會得到下面的腳本。確保更新相應的腳本:

IFS=$'\n' #1 PATH=${PATH}:/usr/local/bin #2 TARGET_PATH="${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/[email protected]" BASE_IMAGE_PATH=$(find ${SRCROOT} -name "[email protected]") #3 convert betaRibbon.png -resize 120x120 resizedBetaRibbon.png #4 convert ${BASE_IMAGE_PATH} -fill white -font Times-Bold -pointsize 18 -gravity south -annotate 0 "Hello World" - | composite resizedBetaRibbon.png - ${TARGET_PATH}

現在來分析發生了什麼:

如果你省略第一行,編譯將失敗。你的終端有一個叫PATH的變數,來存儲一些默認的本地腳本。對於所有的命令終端認為這是第一個,默認並
不是Unix的一部分。這允許任何命令位於一個目錄路徑運行沒有指定完整的命令的位置。Xcode需要將相同的PATH變數分享給你的終端。這行添加
/user/local/bin到PATH變數,Homebrew安裝的地方。
接下來的兩行,獲取本地的應用圖標,然後分別將該路徑保存到TARGET_PATH 和 BASE_IMAGE_PATH 變數中
這行是將betaRibbon.png的圖標的尺寸改為合適的大小;
最後一行做了兩件事情。首先,它在原始的應用圖標上添加"Hello World"文本。然後該腳本執行合成的功能--將有beta標識的圖片放置在其上面。然後將合成的圖片保存為應用的圖標。

提示:應用程序圖標名字不是任意的。在最終的產品,應用程序圖標的名稱必須像[email protected]。Xcode使用此命名約定來確定使用哪個圖標根據設備使用。
運行項目,在你的設備的主屏幕中看你的應用的圖標;吐過你是在模擬其中,可以按Cmd + Shift + H 切換到主屏幕。你將會看到一個修改過的圖標

6. shell 腳本裡面從一個文本裡面讀出一個數字,如何轉換成整數我需要用這個數字進行加減乘除

可以參考下面幾種方法:

法一:

echo ${var%.*} #這個是直接去除小數點及後面所有內容,只用於bash

法二:

echo $var | awk -F. '{print $1}' #以小數點為分隔符取第一個欄位

法三:

echo $var | awk '{print int($0)}' #awk中可直接使用C函數取整

(6)sh腳本IFS分割符計算個數擴展閱讀:

shell腳本

shell script是利用shell的功能所寫的一個程序,這個程序是使用純文本文件,將一些shell的語法與指令寫在裡面,然後用正規表示法,管道命令以及數據流重導向等功能,以達到我們所想要的處理目的。

更明白地來說,shell script就像早期dos年代的.bat,最簡單的功能就是將許多指令匯整寫一起,讓使用者很容易地就能夠一個操作執行多個命令。

7. linux ifs是什麼

Linux下有一個特殊的環境變數叫做IFS,叫做內部欄位分隔符(internal field separator)。IFS環境變數定義了bash shell用戶欄位分隔符的一系列字元。默認情況下,bash shell會將下面的字元當做欄位分隔符:空格、製表符、換行符。可查看《Linux就該這么學》了解更多Linux介紹。

8. shell腳本 {}中IFS以空格和逗號做分隔符,輸出不同

shell環境變數$IFS的用法
S表示 Internal Field Separator (內部欄位分隔符)
示例:
$ IFS=:
$ a=Hello:World
$ echo $a

輸出的結果是:
Hello World

而不是:
Hello:World

順一門有百福 平安二字值千金 萬象更新

9. 請教大神shell的for in語句中怎麼使用多個變數

1、遍歷按空格分隔的字元串:

#!/bin/bash

servers="abc123 das 222"

for server in$servers

do

echo$server

done

2、遍歷字元串列表、用空格分隔:

#!/bin/bash

for server in a b c

do

echo$server

done

3、遍歷參數列表:

#!/bin/bash

for arg in $*

do

echo$arg

done

4、遍歷文件目錄:

#!/bin/bash

for i in ~/*.sh

do

echo$i

cat$i

done

註:$i是整個目錄和文件,for in語句也可以與` `和$( )配合使用,例如:

#!/bin/bash

for i in $(ls~/*.sh)

do

echo$i

cat$i

done

(9)sh腳本IFS分割符計算個數擴展閱讀:

LInux shell之(for in)用法總結

一、語法

for 變數名 in 列表 do 程序段(command) done

注意1:是變數名而不是$變數!

注意2:列表可以做文章!

二、應用

第一類:數字性循環-->seq在in後面的應用

#!/bin/bash

#也是產生等差數列-->默認是1

for i in $(seq 1 10)

#產生的是一個字元串,默認IFS是以空格隔開!

do

echo $(expr $i * 3 + 1);

#主要是復習:expr乘法的特殊用法!-->空格隔開

done

補充:產生[1,10]的自然數-->{}在in後面的應用

total=0

#全局變數for i in {1..100} #".."表示連續,默認也是IFS為空格隔開

do

((total+=i))

doneecho -e "total is:${total}"

#多行注釋

<<COMMENRfor i in mysql_{0,1,4,12}sql

#多個文件

do

echo $i

samtools view -c $i

doneCOMMENT

第二類:字元性循環

最原始的

#!/bin/bash

#使用列表for循環顯示周一到周日對應的英文-->學習日期的英文

for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday

do

echo "$day"

done

變數的類型

#!/bin/bash

list="Linux Java C++ Python"

for

i in $list

do

echo -e "Language is ${i}"

done

cat

在in後面的應用-->逐行讀取文件的內容(默認是IFS),所以不是逐行列印。

#!/bin/bashfor

in $(cat 日誌顏色.sh)

#注意:pwd當前目錄下的文件

do

echo $i

done

第三類:路徑查找

ls在in後面的命令是-->讀取當前pwd下的文件(廣義上)。

#!/bin/bash

for i in `ls`;

#ls可以結合統配符應用

do

echo $i is file name! ;

#注意:的應用

done

用通配符讀取目錄(無命令)

for

file in ~/*;

#一級目錄下的內容-->並不遞歸顯示

do

echo $file is file path ! ;

#${file}代表的是文件的全路徑

done

通過腳本傳參

#!/bin/bash

#回憶1:統計腳本參數的個數echo "argument number are $#"!

#回憶2:參數的內容-->此處可以換成$@來測試!

echo

"the input is $*"

#循環執行

for argument in "$*";

do

echo

"$argument "

done

10. 簡述如何得到當前執行腳本路徑,包括所得到參數

#!/bin/bash

P=`pwd`
echo $P

for i in $*
do
echo $i
done

#End shell

下面做一下說明
$IFS輸入域分隔符, 通常是空格, 製表符和換行符;

$#是傳遞給腳本的參數個數;

$1, $2, ... 依次是腳本程序的第一個, 第二個, ...參數;

$* 是所有參數, 各個參數之間用IFS首字元隔開;

$@ 是$*的變體, 各個參數用空格隔開;

set命令的作用是為shell設置參數變數;

shift命令把所有參數變數左移一個位置, 使$2變成$1, $3變成$2, 依次類推;

eval命令允許對參數求值.