脚本IFS
⑴ 请问Excel判断功能问题
换个公式试试,例如:在A1单元格输入A、B、C、……H后,B1单元格就显示各个字母相对应的1、2、3……8,当然你也可以另行自定义,达到IF函数判断的效果。B1公式=INDEX({1,2,3,4,5,6,7,8},MATCH(A1,{"A","B","C","D","E","F","G","H"}, ))
如果判断不够,参照以上公式照猫画虎地往后写就可以了。反正A返回1、B返回2、C返回3……
⑵ shell脚本 {}中IFS以空格和逗号做分隔符,输出不同
shell环境变量$IFS的用法
S表示 Internal Field Separator (内部字段分隔符)
示例:
$ IFS=:
$ a=Hello:World
$ echo $a
输出的结果是:
Hello World
而不是:
Hello:World
顺一门有百福 平安二字值千金 万象更新
⑶ linux shell脚本用到循环、控制语句
#!/bin/sh
# Name: useraddmuti
# Descripton: To add users to your system. Users can be list in a file.
# To exec this command your ID must be 0.
# Author: [email protected]
#-----------------------------------
chkUID(){
getUID(){
id|sed -e 's/(.*$//' -e 's/^uid=//'
}
if [ "`getUID`" -ne 0 ]
then
echo -e "\tYou are not root!"
exit 0
fi
}
chkUID
usagePRT(){
echo ${USAGE:='USAGE:' `basename $0` '-f namelistfile'}
}
chkFILE(){
if [ ! -z "`awk 'NF!=2{print NF;exit;}' $1`" ] && [ "`awk 'NF!=2{print NF;exit;}' $1`" -ne 2 ] ; then
echo -e "The file's format is not right!"
exit 0
fi
}
userCHK(){
for USER in `awk '{print $1;}' $1`
do
if grep -wq $USER /etc/passwd ; then
echo -e "The user($USER) has been added!"
exit 1
fi
if echo $USER|grep -wq "^[0-9].*" ; then
echo -e "The user($USER)'s name is wrong format!"
exit 1
fi
done
}
setOPT(){
echo -e "Now Let's set some options or you can use default settings."
setGRPNAME(){
while :
do
echo -e "Would you like to add a new group to add these users to it?"
echo -e "Enter YES to create a new group otherwise you must verify the group."
printf "Your Answer: "
read grpopt
case $grpopt in
yes)
printf "Please enter the group's name: "
read grpoptnew
if cat /etc/group|sed 's/:.*//'|grep -wq $grpoptnew ; then
echo "The group's name($grpoptnew) exist."
exit
else
grpname=$grpoptnew
echo -e "All these users will be added to group($grpname)..."
echo -e "Adding group ..."
if cp /etc/group /etc/group.$$ >; /dev/null 2>;&1 ; then
if groupadd $grpname ; then
echo -e "The group($grpname) is added!"
rm -f /etc/group.$$
break 1
else
echo -e "There's something wrong when adding the group($grpname)."
echo -e " *** Please recovered the group file. *** "
echo -e "You can cp /etc/group.$$ to /etc/group to recover."
fi
else
echo "Error! Please check the program or your disk space."
exit 0
fi
fi
;;
*) : ;;
esac
done
}
setGRPNAME
}
addUSER(){
if cp /etc/passwd /etc/passwd.$$ && cp /etc/shadow /etc/shadow.$$ ; then
for user in `sed 's/ .*//' $1`
do
pass=`awk '{
$1~/$name/
{print $2;exit}
} name=$user' $1`
if [ -z "$pass" ] ; then
echo -e "The passwd is used by default sun123."
pass=sun123
fi
if [ ${#pass} -lt 6 ] ; then
echo -e "The user($user)'s password is too short!"
echo -e "Use default password: sun123."
pass=sun123
fi
if useradd $user ; then
echo -e "The user($user) is added."
if echo $pass|passwd $user --stdin >; /dev/null 2>;&1 ; then
echo -e "The user($user)'s password is setted!"
else
echo -e "The user($user)'s password is NOT set!"
fi
else
echo -e "The user($user) is NOT add."
fi
done
rm -f /etc/passwd.$$ /etc/shadow.$$
else
echo -e "There something wrong when backup the passwd and shadow file."
fi
}
if [ $# -ne 2 ] ; then
usagePRT
exit 0
fi
case "$1" in
-f)
if [ -f "$2" ] ; then
echo -e "Reading usernamelist file""("$2")" "..."
chkFILE $2
userCHK $2
setOPT
addUSER $2
else
echo -e "There's no usernamelist file!"
fi
;;
*) usagePRT
exit 0
;;
esac
⑷ shell脚本 IFS没有生效的问题
cd${0%/*}表示删除从变量$0尾部开始第一个正斜冈之后匹配到的内容,返回剩下的内容。比如$0是这个目录/home/john/source那么就是把"/source"截取掉剩下的。
⑸ linux下开发脚本搜索子目录批量更改文件名
前言
本文主要给大家介绍了关于Linux shell用sed批量更改文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
示例
去除特定字符
目标:将 2017-01-01.jpg、2018-01-01.jpg 改为 20170101.jpg、20180101.jpg
方法:将所有 - 替换为空
for file in `ls | grep .jpg`
do
newfile=`echo $file | sed 's/-//g'`
mv $file $newfile
done
这里使用sed进行标准输出的字符串替换,其通用格式如下:
stdout | sed 's/pattern/replace/'
上述示例中,在末尾添加g用于替换所有匹配项,而不仅仅替换第一个匹配项。
中间插入字符
目标:将 book01.txt、paper02.txt 改为 book-01.txt、paper-02.txt
方法:用分组匹配分别获取待插入位置两侧的字符串,再通过反向引用实现替换
for file in `ls | grep .txt`
do
newfile=`echo $file | sed 's/\([a-z]\+\)\([0-9]\+\)/\1-\2/'`
mv $file $newfile
done
分析
上述示例首先通过 ls 和 grep 命令得到待改名的文件列表,然后用 sed 命令进行字符串的替换,最后再使用 mv 命令来完成文件名的更改。
获取待改名文件列表的方法有很多,可以通过 find 命令,也可以直接给出字符串,我们将在下文中提到。
注意 for 循环后面的 ls | grep .txt,这条命令用两个反单引号括了起来,与 $(ls | grep .txt) 的作用相同,被包围的字符串会被当作命令执行,然后返回字符串结果。
文件名包含空格的解决方法
我们可以直接将文件列表写到 for 循环中,而不是通过命令来得到,例如:
for file in "file1 file2 file3"
do
...
done
可以看到 for 循环是通过空格来分割字符串,因此如果待更改的文件名中包含空格的话,就会被拆分成多个文件名,从而出错。
要解决这个问题,我们可以将 IFS(内部字段分隔符)设置为换行符 \n,这样一来,for 循环就会按行来获取变量的值,确保每次获取的确实是一个完整的文件名。
设置 IFS 变量的命令需要放在 for 循环之前:
IFS=$'\n'
for file in `ls`
do
...
done
也可以直接使用 while read 命令一次读取一行到变量 file 中:
ls | grep "*.txt" | while read file
do
...
done
使用 find 获取文件列表
之前的示例中,我们是通过 ls 命令来获取文件列表。该命令只能获取某个目录的文件,而且没法进行多种条件的筛选。
而一说到文件的查找,不得不提到功能强大的 find 命令。该命令可以在多个层次的目录中查找文件,并能够设定诸如创建时间、文件大小、所有者等多种条件,查找起文件来特别方便灵活。
用 find 命令来获取文件列表,再用 sed 命令配合正则表达式来修改文件名,这两个命令的结合几乎能完成所有常见的批量改名任务。
例如,将所有大于1M,且后缀为txt或jpg的文件,由形如 book_20170101.txt、image_20170101.jpg 的文件改名为 20170101-book.txt、20170101-image.jpg,代码如下:
for file in `find . -size +1M -name "*_*.txt" -o -name "*_*.jpg"`
do
newfile=`echo $file | sed 's/\([a-z]\+\)_\([0-9]\+\)./\2-\1./'`
mv $file $newfile
done
⑹ shell脚本中awk命令内置参数与脚本参数冲突,如何使用内置参数
题主你好,
先声明一下,我的脚本不是太好,供参考.
首先IFS不是awk的内置变量, 而是shell内置变量.
另外awk内部的变量和awk外部语句的变量是两套机制,也就是说假设有个变量a=1,你使用awk '{print a}' 并不会输出1 //当然我的awk语句写的不完整,只是为了表达意思.
你想要在awk中使用外部变量,要使用-v参数或是在最后追加参数的方式将想要使用的变量导到awk空间中, 才能使用,也就是说:
awk -v var="$a" '{print var}' 文件名 //此时你可以使用变量var间接输出变量a的值.
或者写为:
awk '{print var}' var="$a"文件名
====
写在最后: 因为我的脚本不太好,所以调试信息也看不大明白,不过感觉应该不难,题主可以举一个简单具体一点的例子说明一下你想执行哪条语句,输出什么结果,我帮你看一下.
⑺ shell脚本中IFS环境变量问题
for entry in `cat /etc/passwd` 执行这个的时候已经把命令的输出展开为一个list列表了,依据的就是当前的IFS,所以后面的再指定IFS,并不会影响已经分割好的列表。因此外层循环中的每个entry是依据换行符分割的字符串,内层循环是依据:分割的字符串
⑻ shell脚本 ,如果用 for in 语句,读取一行内容,急用,请高手回答。 for file in `ls -l --full-time ·
#!/bin/sh
#设置IFS环境变量,这个变量是用来定义分隔符类型的。默认的分隔符为空格、换行符、tab。
#在你的需求中,只需要设置IFS变量的内容为换行符。
#先存储IFS默认值
IFS_old=$IFS
IFS=$'\n'
for line in $(ls -l --full-time)
do
echo $line
done
#将IFS变量还原为默认值
IFS=$IFS_old
⑼ 如何将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 切换到主屏幕。你将会看到一个修改过的图标