r_bash – Telegram
Issues with quotes usage in bash noscript

I'm trying to run this noscript but it doesnt work. I suspect it's because of the single quotes present in the first variable but I don't understand how to correct it. Any idea ?

-----------

#!/bin/sh

CurlCommand="curl -s -H 'Authorization: Bearer TOKENHERE' -X GET `http://123.123.123.123`"

Device1="${CurlCommand}/api/states/sensor.XYZ"

$Device1

-----------

$CurlCommand itself run but I still need to add the "/api/states/sensor.XYZ" suffix to get the exact url I need.

https://redd.it/11wjeor
@r_bash
Last week's "Absurdly minified coloring function," now 126 bytes shorter with a github page and an absurdly maximized explanation

I spent a couple more mornings on that ANSI coloring function for bash noscripts, absurdly minified submission from last week.

Here's a new at-a-glance demo picture.

It's now got a Github page:

https://github.com/rustyflavor/clr.sh

And an explanation of how it works, which is as absurdly long as the noscript is absurdly short:

https://github.com/rustyflavor/clr.sh/wiki/How-does-this-work%3F

After incorporating most of your feedback, and chewing on it myself for another couple hours, it's down from 457 bytes to 331.

That's more than 25% shorter, and roughly 800% harder to read!

Here's the noscript as it stands now with comments removed:

((BASHVERSINFO[0]>3))&&clr(){ local i=$1 l=krgybmcw@ b g c s x
while c=${i::1};[ "$c" ]&&((g<11));do i=${i:1};b=30;case $c in +)s+=";1";;
=)s+=";22";;
)s+=";4";;-)s+=";24";;.)((g+=10));;${l^^})b=90;;&${l^^}|$l)
x=${l%"${c,}"};x=${#x};x=$((x<8?x+b+g:39+g));s+=";$x";((g+=10));esac;done;
printf %b "\e[${s#;}m";}||clr(){ :;}

And, expanded again by bash's `type` builtin:

$ type clr
clr is a function
clr ()
{
local i=$1 l=krgybmcw@ b g c s x;
while c=${i::1};
[ "$c" ] && ((g<11)); do
i=${i:1};
b=30;
case $c in
+)
s+=";1"
;;
=)
s+=";22"
;;
_)
s+=";4"
;;
-)
s+=";24"
;;
.)
((g+=10))
;;
[${l^^}])
b=90
;;&
[${l^^}] | [$l])
x=${l%"${c,}"
};
x=${#x};
x=$((x<8?x+b+g:39+g));
s+=";$x";
((g+=10))
;;
esac;
done;
printf %b "\e${s#;}m"
}

What do those inscrutably short variable names mean? [It's all in the wiki page.


All feedback is welcome, especially ways to shrink it even worse!

https://redd.it/11wrmdg
@r_bash
Help with a bash noscript which uses variables and sed

Good afternoon. I am attempting to use sed -r to find a string and replace with a string that includes a defined variable. The noscript currently looks like:

#!/bin/bash
myrepo=/media/RAID5/graylog-open/opensearch/$(date +%F-%T.%z)

sed -i -r "s/([path.repo]+:\s\[.*\])/(path\.repo\:\ \[\$my
repo\])/g" /graylog/opensearch/config/opensearch.yml &&

However, as can be imagined, escaping "$" in the "\\[\\$my_repo\\\]" causes sed to replace with "$my_repo" vs. $my_repo as the variable is defined.

Failure to escape "$" causes sed to throw an "unknown option to 's'" error.

It would be ideal if sed only used regex to find the string and then replace, verbatim, with "path.repo: [<my_repo variable>\]" however, it looks like "-r" runs regex through the entirity of the command.

Does that make sense?

Any ideas?

Thank you!

https://redd.it/11wx9x9
@r_bash
combining here-docs with process substitution

Hi,

I cannot figure out how to do this properly...

What I want is to generate a config-file on the fly and feed it to another program without writing any temporary files.

Here is an example for lighttpd that is supposed to serve the directory as supplied as argument:

ROOT=${1:-.}

/usr/sbin/lighttpd -f <(cat <<END
server.document-root = "$ROOT"
server.errorlog = "/tmp/lighty.log"
server.pid-file = "/tmp/lighty.pid"
server.port = 8080
server.dir-listing = "enable"
dir-listing.encoding = "utf-8"
END
) -D

This is syntactically correct, however something is wrong as lighttpd complains about document-root not being set...

Can someone help me out here?

Many thanks!

https://redd.it/11wysi0
@r_bash
Sharness 1.2.0 released

Sharness is a test harness written in shell noscript with an output compatible with the Test Anything Protocol.

It was derived from the testing framework used in the Git project.

Writing test noscripts is extremely simple:

test_denoscription='Basic tests'

. ./sharness.sh

test_expect_success 'Success expected' ':'

test_expect_success 'Chained commands' '
echo foo > file &&
echo bar >> file &&
test -s file
'

test_expect_failure 'Failure expected' 'test 1 = 2'

test_done


If you run this noscript, you get a TAP-compatible output:

ok 1 - Success expected
ok 2 - Chained commands
not ok 3 - Failure expected # TODO known breakage
# still have 1 known breakage(s)
# passed all remaining 2 test(s)
1..3


You can write a target in your Makefile to execute them all or run prove, which executes all your test files in parallel.

Because it's written in shell, it's easy for anyone who knows shell to write test noscripts. If you know shell, you know Sharness.

Here's an example run of me running the test noscripts of multiple projects on asciinema: Sharness run.

For more information check the Sharness site.

If you are using Arch Linux, you can use the AUR package I created: sharness.

Enjoy!

https://redd.it/11x72p4
@r_bash
Parser for Command Line Interface Pages is ready for usage

This [parser](https://github.com/command-line-interface-pages/v2-tooling/tree/main/clip-parse) is completely Bash + Sed-based. It allows extracting info about page easily and not to deal with Sed directly, delegating such business for a parser. As parser doesn't built AST, it's a little bit limited.

Let's say we have some page for a command [\[](https://github.com/command-line-interface-pages/cli-pages/blob/main/common/%5B.clip) and want to extract command denoscription. To do so, we have to write this code:

#!/usr/bin/env bash

# shellcheck source=/home/emilyseville7cfg/.local/bin/clip-parse
source clip-parse

# shellcheck disable=2016
declare page='# [

> Check file types and compare values
> Returns 0 if the condition evaluates to true, 1 if it evaluates to false
> More information: https://www.gnu.org/software/bash/manual/bash.html#index-test

- Test if a specific variable is (equal|not equal) to a string:

`[ "{string $variable: $foo}" {string operator: ==|string operator !=} "{string string: Hello world!}" ]`'

parser_summary__denoscription_prettified "$page"


&#x200B;

https://preview.redd.it/zqlxdlddx1pa1.png?width=1920&format=png&auto=webp&v=enabled&s=e0b3ab644abff8624820c3edd20b03466755ec1e

https://preview.redd.it/oq1q32tgx1pa1.png?width=1920&format=png&auto=webp&v=enabled&s=bd70cd3754f35f10a7523909c6c7f52a278342de

To [install](https://github.com/command-line-interface-pages/v2-tooling/tree/main/clip-parse#installation-smile) the parser `make` should be available on your PC (now I support just it, but think about supporting another build systems too).

https://redd.it/11xatx7
@r_bash
(standard_in) 1 syntax error

i am doing

&#x200B;



declare gen_rate=0.9721 declare trans=0.1122 declare sys_pass=0.0851 declare distri=0.1718 declare subs=0.4694 declare government_tax=0.0988 declare uni_rate=0.0294 basic_charge=$(echo "$basic_rate * $kwh_used" | bc) gen_charge=$(echo "$gen_rate * $basic_charge" | bc) trans_charge=$(echo "$trans * $basic_charge" | bc) sys_charge=$(echo "$sys_pass * $basic_charge" | bc) distri_charge=$(echo "$distri * $basic_charge" | bc) subs_charge=$(echo "$subs * $basic_charge" | bc) gov_charge=$(echo "$governmnet_tax * $basic_charge" | bc) uni_charge=$( echo "$uni_rate * $basic_charge" | bc) totalWater=$(echo "$basic_charge + $gen_charge + $trans_charge + $sys_charge + $distri_charge + $subs_charge + $government_charge + $uni_charge" | bc)```

https://redd.it/11xjdf9
@r_bash
I Created a Bash Script and I'm not getting the Output I wanted

So, I made a noscript to be integrated in a Cron Task, running in 5 minute intervals, with the objective of listening to a log file that is created daily, searching for a defined pattern. I have made it in a way that everytime the noscript is executed, it reads the file based on a .flag file that saves the last line read from the log file.


After running the noscript, I see that it didn't do what it was intended and the .flag file only has a 0 written in it.


My Script:


#!/bin/bash

LASTPOSFILE="lastposition.flag"

PATTERN='ERROR [pt.gsoft.oasis.platform.plugins.mediaconverter.ejb.messages.MediaConverterMDB]'

LOG
FILE='/home/filipe/server.log'

if ! -f "$LAST_POS_FILE" ; then
echo 0 > "$LASTPOSFILE"

fi

LASTPOS=$(cat "$LASTPOSFILE")

CURR
LOG=$(date +"%Y-%m-%d")

if "$LOG_FILE.$CURR_LOG" -nt "$LOG_FILE" ; then
LOGFILE="$LOGFILE.$CURRLOG"
fi

if [[ "
$LOGFILE" -nt "$LOGFILE" ]]; then
LINE=$(grep -E "
$PATTERN" "$LOGFILE" | awk -F: '{print $1}')

if -n "$LINE" ; then
if "$LINE" -gt "$LAST_POS" ; then
echo "$LINE" > "$LASTPOSFILE"

./teste.sh
fi
fi
fi

# end of file #

Another thing is that, I'm testing on a Ubuntu machine, since I don't have a testing environment for the production machine and the production machine is running Red-Hat, if that something important to have in account.

https://redd.it/11xkqli
@r_bash
Does anyone else get by using ctrl + r 90% of the time?

Honestly, this bash command is the great majority of what I do to as a senior full stack developer using bash. Can anyone else relate?

https://redd.it/11xw5zb
@r_bash
Help with Email Suppression Script from Command Line (Unix / Linux / macOS)

#!/bin/bash(sed 's/^/A /' $1;sed 's/^/B /' $2)|sort -fk 2|uniq -ius 2|sed -ne '/^B /d' -e 's/^A //p'

Enter the following in the macOS Terminal App:

./suppress.sh FileA FileB > FileC

&#x200B;

A friend created this custom noscript for me circa 2010 to solve a problem I had with email marketing. If I had List A that needed to be sent to, but I also had List B of people who should not receive the email, the noscript would create List C, which was made by taking List A and then subtracting the contents of List B. (List C = List A - List B). It was designed to work specifically with email addresses, but I suppose it would work fine for single words on a line.

&#x200B;

It used to work fine, but I haven't used it in a while and there appears to have been enough changes in macOS that it needs a bit of love. Can anyone help with the required updates to make it work? Please see example below.

&#x200B;

EXAMPLE


LIST A (original list)
\---------------------------------------------
one@gmail.com
two@gmail.com
three@gmail.com
four@gmail.com
five@gmail.com
six@gmail.com
seven@gmail.com
eight@gmail.com
nine@gmail.com
ten@gmail.com
LIST B (list of emails to suppress)
\---------------------------------------------
one@gmail.com
three@gmail.com
five@gmail.com
seven@gmail.com
nine@gmail.com
when run, it would create List C which would look like below


LIST C (new list of A-B)
\---------------------------------------------
two@gmail.com
four@gmail.com
six@gmail.com
eight@gmail.com
ten@gmail.com

https://redd.it/11xvb91
@r_bash
please help!

I have a noscript that just sets up Fedora server and a WM but that is not relevant.

the problem is that the fonts do not download to home or unzip to .fonts/truetype. Here is the code snippet

while true; doread -p "Would you like to install JetBrainsMono nerd font Y/N " fontinstcase $fontinst iny|Y ) echo "# Adding Nerd fonts to "$HOME"/.fonts/truetype #"; mkdir"$HOME"/.fonts/truetype; wget-q `https://github.com/ryanoasis/nerd-`fonts/releases/download/v2.3.3/JetBrainsMono.zip;unzip "$HOME"/JetBrainsMono.zip -d "$HOME"/.fonts/truetype;;

n|N ) echo "Aborted, skipping..."

esac

done

Please ignore the formatting it did not get copied over correctly.

https://redd.it/11y3tzr
@r_bash
Need help idk what to try anymore I don’t know how to code really

i have no idea how to code but i need help

i run a Minecraft server for me and some friends and i wanted to add an automatic restart i have worked with chat gtp to try and add this but it wont work here are some we tried. this is in windows 11 CMD. i have more version i have tried but i didn't save them. plz help

START CODE THAT WORKS/original code

echo off



call settings.bat



:start_server

echo Starting SevTech Ages Server...

java -server -Xms1024M -Xmx25600M %JAVA_PARAMETERS% -jar %SERVER_JAR% nogui

pause

exit /B



goto start_server

\---------------------------------------------------------------------------------------

here's some I have tried

\---------------------------------------------------------------------------------------

echo off



call settings.bat



:start_server

echo Starting SevTech Ages Server...

java -server -Xms1024M -Xmx25600M %JAVA_PARAMETERS% -jar %SERVER_JAR% nogui

pause

exit /B



REM Timer to announce server restart

set /a counter=0

:timer_loop

set /a counter+=1

if %counter% equ 28800 (

echo SERVER RESTARTING IN 10 MINS

echo [1m [33mSERVER RESTARTING IN 10 MINS [0m

timeout /t 600

call :restart_server

) else (

timeout /t 60

goto timer_loop

)



REM Function to stop and restart server

:restart_server

echo Stopping SevTech Ages Server...

taskkill /f /im java.exe

echo SevTech Ages Server has been stopped.

echo Restarting SevTech Ages Server...

java -server -Xms1024M -Xmx25600M %JAVA_PARAMETERS% -jar %SERVER_JAR% nogui

echo SevTech Ages Server has been restarted.

goto start_server

\------------------------------------------------------------------------------------------------------------------

echo off



call settings.bat



:start_server

echo Starting SevTech Ages Server...

java -server -Xms1024M -Xmx25600M %JAVA_PARAMETERS% -jar %SERVER_JAR% nogui

pause

exit /B



REM Add timer for server restart

set "colors=1 3 4 6 2 5"

set "color_index=0"

for /l %%x in (1,1,28800) do (

if %%x==1 (

echo \^[[1;32;47mServer started. Starting timer...\^[[0m

)

if %%x==28800 (

for %%c in (%colors%) do (

set /a "color_index=(color_index+1)%%6"

echo \^[[1;%color_index%;47mSERVER RESTARTING IN 10 MINS\^[[0m

timeout /t 10 /nobreak > nul

)

echo \^[[1;31;47mSERVER RESTARTING NOW\^[[0m

taskkill /f /im java.exe > nul

java -server -Xms1024M -Xmx25600M %JAVA_PARAMETERS% -jar %SERVER_JAR% nogui

)

)

https://redd.it/11ye68j
@r_bash
Why change directory in a noscript suite?

I am not the strongest programmer (since I am a phycisist), but have been tasked with migrating a series of old noscript suites to a different environment.

In several of these noscripts, I will see commands such as:

"cd $BINDIR"

"cd ../data"

"cd $PWD"

To me, this is a mess, and begs for errors and issues in case of developments that won't work because you're suddenly in a different directory than the project root. Does anyone know if there is a reason for changing directory in a noscript suite? Why not run everything from the project home? Maybe I am missing some smarter idea behind the structure here?

https://redd.it/11ykqgm
@r_bash
How to create a 'Dummy File' in Bash

Using a command called "Fallocate", you can easially create a small or even very large file that does nothing but take up space.

Command:

fallocate -l <size><binary_prefix> <filename>

Examples:

1 MB FILE:

fallocate -l 1m MyTXT.txt

1 GB FILE:

fallocate -l 1g MyPDF.pdf

1 TB FILE:

fallocate -l 1t MyFile

https://redd.it/11yvm45
@r_bash
Trying to make a noscript with the arithmetic operation on the two numbers

How could you do a method that you can take an input such as

(Number1)+, -, *, /, %(Number2)

So if person types 7+1

Returns 8, but also can check for the other operators such as -,*,/,%?

Instead of just checking for one operator

https://redd.it/11z0lxt
@r_bash
Asking for help with elifs and functions

I was attempting to do an assignment for my class, but I'm sure I went wrong somewhere when I was trying to do the code. I'm not the most experienced in bash, so I tried my best. I'm just asking where exactly I went wrong while doing this.

For context purposes ONLY, the assignment was:

Write a program that asks the user to enter five test scores in bash shell noscript, please.The program should display a letter grade for each score and the average test score. Design the following functions in the program:
● calcAverage—This function should accept five test scores as arguments and
return the average of the scores.
● determineGrade—This function should accept a test score as an argument
and return a letter grade for the score (as a String), based on the following
grading scale:
Score Letter Grade
90–100 A
80–89 B
70–79 C
60–69 D
Below 60 F

&#x200B;

I do not intend on looking for answers! I'm simply wondering where I went wrong.

https://preview.redd.it/7ndblqi5xepa1.png?width=464&format=png&auto=webp&v=enabled&s=2f75b3a627fde4edcbc7da8ad5f3661a54d342a8

https://redd.it/11z85eg
@r_bash
Trick condition using cron

Let's say I have a cron job that checks certain system condition. For purposes to describe this scenario, my cron job checks the RAM utilization every 5 min and if the condition is met, the cron kills a process and creates a file. The process restarts automatically BUT the cron should check continuously but should not kill the process AGAIN in the next 6 hours. Any ideas how to address such scenario ?

https://redd.it/11zi6w7
@r_bash
How to make it case-insensitive

I have a noscript like this:

#!/bin/bash

VIDEO_EXT=".mkv"

AUDIO_EXT=".mka"

SUBTITLES_EXT=".ass"



REMOVE_OLD_FILES=true



for filename in ./*${VIDEO_EXT}; do

file_name="$(basename "$filename" "$VIDEO_EXT")"

merged_file_name="${file_name}-merged${VIDEO_EXT}"



stream_count=1



audio_inputs=""

audio_map=""



# Detect all audio

for audio_folder in ./Sounds/*; do

if [ -d "$audio_folder" ]; then

audio_inputs="${audio_inputs} -i \"${audio_folder}/${file_name}${AUDIO_EXT}\""

audio_map="${audio_map} -map ${stream_count} -metadata:s:a:${stream_count} noscript=\"${audio_folder##*/}\""

stream_count=$(expr $stream_count + 1)

fi

done



subnoscripts_inputs=""

subnoscripts_map=""



# Detect all subnoscripts

for subnoscripts_folder in ./Subnoscripts/*; do

if [ -d "$subnoscripts_folder" ]; then

subnoscripts_inputs="${subnoscripts_inputs} -i \"${subnoscripts_folder}/${file_name}${SUBTITLES_EXT}\""

subnoscripts_map="${subnoscripts_map} -map ${stream_count}"

stream_count=$(expr $stream_count + 1)

fi

done



# Converting

eval "ffmpeg -y -i \"${filename}\" ${audio_inputs} ${subnoscripts_inputs} -map 0:v -map 0:a ${audio_map} ${subnoscripts_map} -c:v copy -c:a copy -c:s srt -shortest \"${merged_file_name}\""



# Removing

if [ "$REMOVE_OLD_FILES" = true ]; then

# Removing original videofile

eval "rm \"${filename}\""



# Removing audiofiles

for audio_folder in ./Sounds/*; do

if [ -d "$audio_folder" ]; then

eval "rm \"${audio_folder}/${file_name}${AUDIO_EXT}\""

fi

done



# Removing subnoscripts

for subnoscripts_folder in ./Subnoscripts/*; do

if [ -d "$subnoscripts_folder" ]; then

eval "rm \"${subnoscripts_folder}/${file_name}${SUBTITLES_EXT}\""

fi

done



# Renaming merged videofile to original name

eval "mv \"${merged_file_name}\" \"${filename}\""

fi

done

&#x200B;

&#x200B;

I would like it to be case insensitive. because I compress some shows and then add soundtracks and subnoscripts.

Sorry if there was, I just do not know noscripts and programming

https://redd.it/11zj7mm
@r_bash
When I make a variable, does the code in that variable run itself?

Hello, I've just started learning Bash at home. But I'm not sure if when I "declare" a variable, if the code runs itself. Because I'm using freecodecamp to learn Bash, and I'm learning to use Bash and putting text from csv files into SQL.

I have this line of code

INSERTMAJORRESULT=$($PSQL "INSERT INTO majors(major) VALUES('$MAJOR')")

$PSQL just logs in and out of PSQL.

But what I'm not understanding is that I do not echo the $INSERT_MAJOR_RESUT, it's just there. Yet it still runs the code. I thought I would need to echo that variable for it to run that code.

&#x200B;

Here is all of it. And the code under # insert major comment runs every loop and puts data into the database. I'm confused

# Script to insert data from courses.csv and students.csv into students database

PSQL="psql -X --username=freecodecamp --dbname=students --no-align --tuples-only -c"
cat coursestest.csv | while IFS="," read MAJOR COURSE
do
if [[
$MAJOR != "major" ]]
then
# get major
id
MAJORID=$($PSQL "SELECT majorid FROM majors WHERE major='$MAJOR'")
# if not found
if [ -z $MAJOR_ID ]
then
# insert major
INSERTMAJORRESULT=$($PSQL "INSERT INTO majors(major) VALUES('$MAJOR')")
fi
fi
done

https://redd.it/11zl43y
@r_bash