标签: shell-script

如何更改多个文件的扩展名?

我想从改变文件扩展名*.txt*.text。我尝试使用该basename命令,但在更改多个文件时遇到问题。

这是我的代码:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done
Run Code Online (Sandbox Code Playgroud)

bash shell-script rename

289
推荐指数
14
解决办法
44万
查看次数

如何从某些输出的每一行中修剪前导和尾随空格?

我想从输出的每一行中删除所有前导和尾随空格和制表符。

有没有一个简单的工具,比如trim我可以将我的输出输入到其中?

示例文件:

test space at back 
 test space at front
TAB at end  
    TAB at front
sequence of some    space in the middle
some empty lines with differing TABS and spaces:





 test space at both ends 
Run Code Online (Sandbox Code Playgroud)

pipe shell-script text-processing whitespace

265
推荐指数
10
解决办法
52万
查看次数

如何为 Systemd 编写启动脚本?

我的笔记本电脑上有 2 个显卡。一个是IGP,另一个是离散的。

我写了一个shell脚本来关闭独立显卡。

如何将其转换为 systemd 脚本以在启动时运行它?

init-script shell-script systemd

257
推荐指数
1
解决办法
49万
查看次数

清空文件内容的最有效方法

我知道从文件中删除所有条目的三种方法。

他们是

  • >filename
  • touch filename1
  • filename < /dev/null

在这三个中,我滥用>filename最多,因为它需要最少的击键次数。

但是,我想知道就大日志文件和小文件而言,这三个中哪个最有效(如果有更有效的方法)。

另外,这三个代码是如何操作和删除内容的?


1编辑:正如在这个答案中所讨论的,这实际上并没有清除文件!

shell-script files truncate

257
推荐指数
3
解决办法
43万
查看次数

在 shell 脚本中使用字符串操作删除字符串的最后一个字符

我想删除字符串的最后一个字符,我尝试了这个小脚本:

#! /bin/sh 

t="lkj"
t=${t:-2}
echo $t
Run Code Online (Sandbox Code Playgroud)

但它打印“lkj”,我做错了什么?

string shell-script

244
推荐指数
11
解决办法
58万
查看次数

如何在shell脚本中创建临时文件?

在运行脚本时,我想在/tmp目录中创建一个临时文件。

执行该脚本后,该脚本将清除该脚本。

如何在shell脚本中做到这一点?

shell-script tmp

243
推荐指数
5
解决办法
24万
查看次数

忘记在 bash/POSIX shell 中引用变量的安全隐患

如果您已经关注 unix.stackexchange.com 一段时间了,那么您现在应该知道,echo $var在 Bourne/POSIX shell(zsh 是例外)中的列表上下文(如)中不加引号的变量具有非常特殊的含义,并且除非你有很好的理由,否则不应该这样做。

在这里的许多问答中详细讨论了它(例如:为什么我的 shell 脚本会因空格或其他特殊字符而窒息?何时需要双引号?shell 变量的扩展以及 glob 和 split 对其的影响引用vs 不带引号的字符串扩展)

自从 70 年代末 Bourne shell 首次发布以来就是这种情况,并且没有被 Korn shell 改变(David Korn 最大的遗憾之一(问题 #7))或者bash大部分复制了 Korn shell,这就是POSIX/Unix 是如何指定的。

现在,我们仍然在这里看到许多答案,甚至偶尔会公开发布未引用变量的 shell 代码。你会认为人们现在已经学会了。

根据我的经验,主要有 3 类人会省略引用他们的变量:

  • 初学者。这些可以被原谅,因为它是一种完全不直观的语法。我们在这个网站上的职责是教育他们。

  • 健忘的人。

  • 即使经过反复锤击也不相信的人,他们认为Bourne shell 的作者肯定没有打算让我们引用所有变量

如果我们揭露与此类行为相关的风险,也许我们可以说服他们。

如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?

我们在这里谈论什么样的漏洞?

在什么情况下会出现问题?

shell security bash shell-script quoting

241
推荐指数
3
解决办法
3万
查看次数

如何在简单的 shell 脚本中获取分发名称和版本号?

我正在开发一个简单的 bash 脚本,它应该能够在 Ubuntu 和 CentOS 发行版上运行(对 Debian 和 Fedora/RHEL 的支持将是一个加分项),我需要知道脚本正在运行的发行版的名称和版本(以触​​发特定操作,例如创建存储库)。到目前为止,我所得到的是:

OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')

if [ -z "$OS" ]; then
    OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi

if [ -z "$VERSION" ]; then
    VERSION=$(awk '{print $3}' /etc/*-release)
fi

echo $OS
echo $ARCH
echo $VERSION
Run Code Online (Sandbox Code Playgroud)

似乎有效,返回ubuntucentos(我没有尝试过其他人)作为发布名称。但是,我有一种感觉,必须有一种更简单、更可靠的方法来解决这个问题——这是真的吗?

它不适用于 RedHat。/etc/redhat-release 包含:Redhat Linux 企业版 5.5 …

linux shell-script distributions

231
推荐指数
8
解决办法
29万
查看次数

bash 脚本中 IFS=$'\n' 的含义是什么?

bash shell 脚本的开头是以下行:

IFS=$'\n'
Run Code Online (Sandbox Code Playgroud)

这组符号背后的含义是什么?

command-line bash shell-script

230
推荐指数
3
解决办法
30万
查看次数

重定向到 /dev/null

我正在阅读一个示例 bash shell 脚本:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp …
Run Code Online (Sandbox Code Playgroud)

shell-script null

227
推荐指数
4
解决办法
54万
查看次数