当前位置:首页 » 网页前端 » 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命令允许对参数求值.